јули 11, 2019

Развојни алатки

…во која гледаме некои од алатките кои ни помагаат да се развиеме.

Source: http://gerph.org/riscos/ramble/buildtools.html

Џастин Флечер/Justin Fletcher

ResEd

Application icon for !ResEd

!ResEd

!ResEd алатка немаше премногу работа на тоа. Покрај тоа што е претворена во новиот систем за градење – како и сите негови поткомпоненти – навистина не треба многу работа. Главната апликација за школка ги обезбедува сите ‘датотеки’, и оптоварувањето и зачувување, и постојат неколку под-компоненти за секој од типот на објект на Toolbox. Тоа е доста добро обмислен и функционира добро како една апликација (апликацијата !Configure не е толку добро интегрирана).

Јас го ажурирав главниот школка за да имам малку повеќе интерфејс сличен на филтер, дозволувајќи им на режимот на “мали икони” и “целосни информации” во неговиот екран. Додека беше малку повеќе стандард, тоа навистина не изгледаше добро, па ја напуштив опцијата исклучена. Се прашував, подоцна, дали на прозорецот можеше да му се даде малку повеќе како !Paint, со лента со алатки и можеби статусната лента на дното. Дури и означувањето на изменетите објекти во главниот прозорец на прозорецот и обезбедување на “враќање” за промени во некој објект може да помогне да се направи апликацијата малку покорисна.

Секоја од поткомпонентите има свој дел за играње, но единствената реална објектна апликација што ја поминав во секое време беше уредникот на Window. Навистина бев многу забавно со тоа <smile>.

Проблемот со уредувачот на прозорецот е дека додека постојат апликации кои обезбедуваат интерфејсот за поврзување за различни објекти, не постои еквивалент за уреди. Внатрешно, сите уреди беа опишани во една голема датотека која ги содржи сите дефиниции за сите уреди. Додека тие беа опишани во убав едноставен сет на структури и имаа пристап до голем број функции за да ја завршат својата работа, тие не беа лесни за некој друг да ги ажурира.

Ако напишавте нови уреди, ќе морате да разговарате со личноста која ја изградил !Window за да ја ажурира дефиницијата за да содржи нова дефиниција за уредите и сите пораки и обрасци што се потребни ќе треба да се спојат во главната апликација. Ова ми изгледаше неразумно и би било причина луѓето да не развиваат уреди – што би било тажно бидејќи тие се одличен начин за проширување на корисничкиот интерфејс. Бев решен да ги отстранам причините да не го користам Toolbox каде што можев, и ова беше област која не беше премногу тешко.

Јас веќе го направив системот BootMenu подржува динамичко вчитување на екстензии, така што Podules би можел да обезбеди сопствени записи од менито за конфигурација. Го искористив она што го научив од тоа за да додадам динамичко вчитување на кодот кој дефинира како уреди беа уредувани. Бидејќи дефинициите на уредот на уредникот на прозорецот беа добро структурирани, не беше тешко да ги преместите во одделни датотеки. Имаше нов извоз од компонентата на уредувачот на прозорци, така што заглавјата беа достапни за дефинициите за уредувачи на уреди кога тие се вчитаа.

Секој од уредите беше одделен во компоненти во свој ред – тие имаа свој извор директориум, makefiles и ресурси. Овие компоненти потоа беа вградени во под-директориуми во апликацијата уредувач на прозорци и беа вчитани кога уредникот започна. Шаблоните и пораките беа поделени, така што тие можеа да се пристапуваат одделно и не требаше да се спојат во главните датотеки. Во суштина, треба да можете да го избришете директориумот во апликацијата уредувач на прозорци и поддршката на уредот ќе исчезне – или можете само да копирате преку врвот на стариот за надградба.

Почнав со уредите “етикета”, што беше наједноставно, и работев на посложените уреди како икони за запишување. За повеќето уреди, сфатив дека треба да извезувам уште неколку функции за да можат да ја завршат својата работа. Се надевам дека успеав да вклучам доволен извоз што уредник може да биде напишан за повеќето идни уреди (но јас сигурно пропушти некои работи).

Секоја дефиниција на уредот исто така беше ажурирана за да може да обезбеди детали за модулите што им се потребни. Модулите беа обезбедени и натоварени по потреба, кога уредникот беше стартуван. Ова значи дека ако имате соодветен модул на системот, ќе можете да го направите, како и да го уредувате.

Идејата беше дека како дел од друг издание на SDK, ќе ги вклучиме потребните детали за да објасниме како сте напишале уредувач на уреди. ‘App notes’

што Acorn ги произведе на пишувањето уреди беа всушност сосема добри, но очигледно нема да ги опфатат уредите за уредување на уреди, па затоа би било неопходно да напишете нешто што објаснува како креирате ваква редакторска библиотека, заедно со потребниот извор и примери.

Сè уште е неопходно да се ажурира апликацијата !ResTest со деталите за секој тип уреди, што исто така е фрустрирачко. Сепак, тоа требаше да биде некоја идна работа (која никогаш не сум ја добила).

Тоа, исто така, значеше дека пишувањето на поддршката на уредувачот за поновите уреди, како што е AMPlayer уредите, беше доста лесно. Некои од другите уреди беа само едноставни копии на основните уреди со некои мали надградби. За едноставни уреди, целата динамична библиотека содржана беше структура која ја опишува интеракцијата на иконите. Размислував да напишам алатка која ќе ги направи дефинициите на структурата од датотека со заглавија, како што е CMHG, но одлучи дека дефинирањето на дефиницијата од рака е всушност поголема веројатност да биде корисно.

Сите датотеки на шаблонот добија третман од страна на FixUpTemplate за да бидат сигурни дека се уредни и конзистентни.

Јас додадов некои пробна поддршка за прикажување на бројот на уредот заедно со уредите, во прозорецот. Сепак, ова навистина не изгледаше толку добро и ја исклучив опцијата пред да добијам можност да го додадам корисничкиот интерфејс за да го контролирам. Намеравав да се вратам на таа опција, така што би било полесно да се референцираат уредите.

Прозорецот на клучни кратенки беше малку надграден, така што кратенките се покажаа малку подобри и имаа стандардни имиња за нив. Ова го подобри својот изглед малку, и за подобрување на употребливоста, беше додадена поддршка за влечење на повеќекратни кратенки помеѓу прозорците за да ги копираат.

Едно нешто што не го добив за ажурирање беше палетата на уреди. Се уште треба да ја ажурирате палетата со дефиниција уреди. Навистина, палетата треба да се креира динамично, но тоа ќе биде малку построга за да се направи директно. Требаше малку повеќе да се размислува за да се направи тоа толку флексибилно колку што може, не само затоа што некои уреди уредници можеби ќе сакаат да обезбедат група дефиниција уреди.

Промените во уредувачот на прозорци направија многу полесно да ги направат другите уреди достапни. Тоа беше, на крајот на краиштата, значеше да биде модуларен систем. Но, имаше и други области кои навистина беа потребни за решавање. Сакав да обезбедам поголема интеграција на други апликации, особено интегрирани алатки за развој на софтвер, кои може да ги обезбедат трети лица. Имаше неколку работи кои можеа да се направат таму со блиска интеграција за размена на пораки со Toolbox идентификатори на објект и уреди и слично, но сакав да ги оставам тие до подоцна. Не само што беа тешки, но исто така ми требаа да разберам што ќе се случат можните случаи на употреба, пред да дизајнирам протокол за да ги споделите таквите работи.

На ниво над таквата блиска интеграција, беше она што го направив – обезбедување поддршка за External Edit во !ResEd. Протоколот за External Edit дозволува апликацијата да побара уредник да ја изврши својата работа во датотека, а потоа да ја врати датотеката еднаш заврши. Првенствено уредувањето се изведува од текстуален уредувач, а апликацијата барател е алатка која има потреба од поголем влез како клиент за е-пошта. Но, воопшто не мора да биде текстуален текст, и веќе имам додадено поддршка за External Edit на !FormEdExt за датотеки со шаблони.

Во овој случај, !ResEd беше уредник. Ги прифаќа барањата за External Edit за датотеки со ресурси, и може да ги врати на барање, или да го напушти уредувањето. Контролите на курсорот не функционираат, бидејќи во уредувачот нема курсор. Идеално треба да биде можно да се активира уредување на објектот во рамките на датотеката за ресурси, но тоа не е предвидено (со протокол или имплементација). Го искористив стариот тест за уредување што првично го напишав за да ја тестирам поддршката за External Edit кога ја додадов !FormEdExt.

Сето тоа работеше многу добро, иако јас сум прилично сигурен дека поддршката не е спомната никаде како што беше уште една рана карактеристика и без какви било апликации за поддршка, тоа навистина не направи многу.

Using External Edit with ResEd to edit a file

Уредувањето на ресурсната датотека, а потоа враќањето на изменетата датотека беше доста едноставно.
(Анимирана верзија (95K))

ResTest

Application icon for !ResTest
!ResTest

Една работа што ја додадов за да ја олеснам употребата на !ResEd беше да додадете елемент од менито “Тест” на дното на менито Датотека. Ова ќе ја повика апликацијата !ResTest и ќе му ја пренесе копијата од тековната датотека. Имаше едноставен протокол со кој комуницираа !ResTest но јас не се чувствував премногу удобно со него за да го дефинирам правилно. Таа ја заврши работата, и тоа го направи уредување и тестирање на ресурси додадени фајлови многу полесно. На крајот, тоа би било исправито, дизајнирано и документирано правилно.

Со сите други додатоци кои беа додадени и новите пораки испратени од предметите, !ResTest беше потребен ажурирање за да ги додаде деталите во неговиот прозорец за дебагирање. Јас додадов поголем дел од новите лентови со Toolbox како што се Window_GadgetLostFocus и Window_GadgetMouseScroll пораки, и сите нови од објектите OptionsWindowScrollListTextArea и други уредни.

MethodGen

Application icon for !MethodGen

!MethodGen

Првично Компонентите на Toolbox беа изградени од група ad hoc makefiles, исто како и остатокот од изворот на RISC OS. Ги ажурирав овие за да го користам некои “стандардни” формати за форматирање што го намалија износот на одржување. Откако го направив тоа, потоа ги направив сите makefiles посложени со додавање на повеќе опции во изградбата! Всушност, тоа не беше толку лошо како тоа – гради на компонентите на Toolbox беа малку различни од многу модули, бидејќи тие имаа голем број на ресурси за извоз и заглавија.

Освен тоа, се преселив околу начинот на кој се постапуваше со дефинициите. Секој објект и gadget има датотека “Методи дефиниции” која ги опишува влезните и излезните параметри. Овие датотеки се користат за да се изградат методите интерфејси во изворни датотеки, кои потоа би можеле да бидат вградени во објектните датотеки. Внатрешно, тие штотуку беа складирани во компонентата библиотеки со алатки, но тоа немаше многу смисла.

Дефинициите на методот, генерално, се менуваат кога се менува имплементацијата. Општо земено, методите всушност не се менуваат (како што би ја нарушиле компатибилноста со ABI), но често се додаваат повеќе. Ги преместив сите дефиниции од тоа што беа вклучени во библиотеките со Toolbox до изразот “дефиниции” во секоја компонента. !MethodGen алатката беше ажурирана за да може да генерира извори од командната линија. Претходно, работниот тек ќе биде да се вчита алатката !MethodGen да се направат модификации на методот на датотека, да се зачува, а потоа притиснете го копчето за да генерирате извори од него. Изворите тогаш ќе треба да се додадат рачно во компонентата на библиотеката со Toolbox (под претпоставка дека сте се сетиле на тоа), а потоа библиотеката со алатки повторно е изградена.

Новиот метод значеше дека додека сеуште требаше да се сетиме да ја провериме датотеката со методот со компонентата (што е прилично доста дадена), следната реконструкција на библиотеките на Toolbox ќе ја искористи новата извезта на методот за да ги изгради изворите и да ја конструира целосна библиотека. За да се направи работата за градење, алатката MakeGen исто така беше исчистена.

На алатката MakeGen беше наменета да преземе сет на директориуми и да ги изгради релевантните makefiles така што сите датотеки во тие директориуми биле изградени со компајлерот C и се поврзани во целната библиотека. За разлика од остатокот од системот за градење, оваа алатка не можеше да го користи стандардниот библиотечен скелет, бидејќи се очекуваше да се користи без да остане присутниот остаток на makefile системот. Во суштина, излезот од !MethodGen може да се користи, заедно со MakeGen, од страна на секој кој немал главен систем за градење.

Фактот што мораше да биде во можност да се користи надвор од стандардната градба значеше дека не се стекнува со способност да цели 32-битни или 26-битни изгради самостојно. MakeGen беше ажуриран така што, во зависност од тоа како се повикува, може да генерира makefiles способни да градат само 32-битни, само 26-битни или двете библиотеки. Можеби изгледа малку чудно да се градат модерни компоненти со 26-битни варијанти, но сè уште имало библиотеки кои биле само 26-битни. Плус, секако, кога ROM е изграден за 26-битно опкружување што требаше да се поврзе со 26-битни библиотеки.

Алатката MakeGen, и !MethodGen, би биле дистрибуирани како дел од развојните алатки во следната Изберете порака. Претпоставувајќи, значи, имало доволно време да ги тестираат и да се состави дистрибуција која беше употреблива од други луѓе. Не сум сигурен дека дистрибуцијата на алатките за развој беше особено важна за луѓето, но ми е важно дека тие алатки ќе бидат достапни. Нема смисла да се има екстензибилен Toolbox ако луѓето мора да се борат за да го прошират, а направените алатки кои значително полесно се борат.

ImageFileGadget methods

Уредување на ImageFileGadget методи во !MethodGen апликација.

Perl, и други алатки

Имаше и други алатки за поддршка кои беа испорачани како дел од системот за градење, кои треба да се ажурираат за да се поддржат градењето на работите. Во многу случаи, немаше премногу проблеми во обновата на компонентите. Промените во самиот систем за градење значеа дека креирањето makefile за нова алатка која би можела да се изгради во 26битови, 32битови или некоја друга варијанта, беше многу лесна.

Perl се користи за неколку алатки, и систем за изградба на највисоко ниво, за обработка и контрола на неколку работи. Првичниот систем за изградување беше снабден со неколку awk скрипти кои беа… добро, не ми се допаѓа awk со страст, што речиси целосно се припишува на неговата употреба во системот за изградба на RISC OS. Замените Perl скрипти беа далеку појасни, иако јас не би сосема сфати колку е важно да се осигураме дека коментарите се користат и се релевантни.

Perl што го користевме во рамките на изградбата беше последната добра верзија која не користеше UnixLib – 5.001. Да се биде верзија 5 Perl, тоа е прилично способен, но нема многу подобри нови функции. Сепак, тоа е добра работа подобро од awk на било кој ден од неделата. Претворањето на новиот систем за изградување беше тривијално, а во исто време решив да го испитам она што го предизвикало дискот да се вртат кога започнал преведувачот – иако ништо не прави.

Тоа е лошо. Не сфатив колку е лошо, но… за да го населам првичниот %ENV хаш со системските променливи, тоа ќе издаде *Show { > some scrap file }, ја прочитав датотеката во меморијата, а потоа го анализирам линија за да се создадат парови со клучни вредности. Не само што е ова непотребно со пишување на дискот, туку се воведува состојба на трката, а тоа е под влијание на било која алатка која ја менува командата *Show Имав таков инструмент, и за среќа се снајде со начинот на кој беше произведен производството, но сепак е погрешно.

Зедов време за да ја преработи хаш-популацијата, така што наместо тоа ги користеше SWI OS_ReadVarVal повиците. Таа сеуште ја создаваше табелата за животна средина на ист начин како и порано – пар со клучна вредност – но веќе не отиде на диск за да го стори тоа, и така трчаше доста побрзо.

Бев заинтересиран, во еден момент, со користење на опциите за изградба на повеќекратноста за да го изградам Perl како модул или да користам повеќе инстанција за да обезбедам различни инстанци во некоја апликација. Таквите нешта се со ограничена употреба, но имање на Perl на рака со ниски трошоци за стартување, можеше да биде многу корисно.

Имаше цела група на други алатки кои требаше да бидат изградени или создадени. Системот за градење беше снабден со алатка наречена Kitten – тоа е мала “мачка” (во смисла на Unix, спојување на датотеките кои се доставуваат до неа). Зедов мала верзија на BSD и го искористив тоа на свое место. Целата поента на алатката беше да се има доследно и познато однесување за алатката.

Други алатки беа само стандардни алатки на RISC OS кои требаше да се репродуцираат. CDir, IfThere, Copy, Destroy, и SetType пролетта на ум. Сите команди постојат на оперативниот систем RISC, но кога работите со изградбата на Linux или Windows, треба да имате конзистентни команди кои ја прават вистинската работа, без да се грижите за некои посебни случаи. Репродукцијата на овие алатки беше всушност многу едноставна – на пример, SetType само би ја преименуваше датотеката за да има точна ,xxx завршувајќи за типовите на датотеки што им беа дадени.

Сите алатки ги користеа библиотеките кои разбраа како да ги преземат имињата слични на оперативниот систем на RISC OS и да ги користат во родните формати, што значи дека сите произведени формирање на датотеки може да се користат речиси точно како што стоеја. Само во неколку случаи беа потребни дополнителни преводи.

Алатки како sed не беа користени многу, но беа потребни за некои специјализирани преводи. Компонентите “C in assembler” ќе се компајлираат со асемблирачки датотеки, кои потоа ќе бидат малку модифицирани за да ги отстранат нештата како што се декларации на AREA и слично. Слично на тоа, специјализираните алатки на бизон (парсер генератор) и флекс (лексички анализатор) не се сеќавам на што точно се користат, но имам нејасно чувство дека libpcap ги користел како дел од својот парсер.

Алатката DefMod која беше користена од OSLib за да ги изгради своите извори, беше ажурирана и на 26-битни и 32-битни гради. Ова значеше нешто повеќе бидејќи OSLib беше искористен за изградба на неколку компоненти, и ние требаше да можеме да ја изградиме библиотеката за цели од 26-битни или 32-битни, на ист начин како и сите други библиотеки.

Секогаш има корисни алатки и контрола за менување на кој било дел од системот за градење – не е секогаш неопходно, но сигурно е корисно. Иако во некои случаи тоа значи создавање на алатки кои веќе беа имплементирани во RISC OS, тоа даде многу повеќе слобода во тоа што може да работи на Linux или Windows.

FixUpTemplate

IconBorders додадени во системот за да ги направат работите да изгледаат поубави и полесно да стигнат за корисниците. Сепак, еден ефект што го имаа беше да се намали забавата на работната површина. Првично ова беше поради тоа што секој заоблен агол или мешавина на копчиња ќе биде прикажан директно на екранот – понекогаш пиксел по пиксел – што беше доста бавно. За да се ублажи ова, содржината на копчињата што треба да се репродуцираат беа кеширани при употреба во областа за справување контролирана од модулот IconBorderRound. Ова значеше дека кога истиот стил на копче беше нацртан, тоа ќе го направи со само заговор за кешираното копче.

Сепак, ова се појави како проблем во тоа што иконите кои се користеа низ целиот систем – во апликациите и вградените модули – беа навистина неконзистентни. Апликациите базирани на алатки беа во ред, бидејќи стандардните копчиња што ги земавте од палетата генерално беа оставени со стандардна големина. Ова значеше дека повеќето апликации на Toolbox имале сосема доследен изглед и чувство. Апликациите базирани на шаблони беа помалку конзистентни – и тоа значеше поголем дел од оперативниот систем.

Во некои случаи, јас веќе почнав да го стандардизирам начинот на кој се поставени дијалозите и големината на копчињата, но тоа не беше секогаш точен процес. Стилот што го следеше оперативниот систем беше сосема конзистентен, а потоа следеше од општ начин на кој се случуваше апликациите – особено !Browse и конфигурациски компоненти на RISC OS 4.

Стилот беше прилично едноставен (фигури и ограничувања земени од FixUpTemplate, па се она што јас го држев, претпоставувајќи дека сум го прочитал кодот во право).

  • Копчињата треба да бидат големини што ги користи палетата !ResEd стандардно, освен ако не постојат посебни причини да не се.
  • Копчињата за акција би биле високи 52 пиксели, со ширина од 188. Ако треба да бидат поголеми, треба да бидат 12+16*број на знаци.
  • Стандардните копчиња ќе бидат високи 68 пиксели, со ширина од 204. Ако треба да бидат поголеми, треба да бидат 12+16+16*број на знаци.
  • Никој копче не треба да биде поголем од 22 знаци или помал од 6 знаци (воопшто) – на некои јазици што може да бидат различни, но за англиски, тоа е добро.
  • Во отфрлените дијалог-кутии, делителската линија треба да биде поставена на дното од кутијата со акционите копчиња под неа.
  • Разделувачите треба да бидат базирани во левата мера на прозорецот.
  • Копчињата за отпуштање под делител мора да бидат директно поставени, а највисокото копче е стандардно копче.
  • Иконите што се наредени по ред треба да бидат распоредени 8 единици.
  • Висини и вертикални положби на иконите мора да бидат разложени разумно – основите треба да бидат во истата точка.
  • Иконите поставени вертикално треба да имаат разумна линија на левата и десната страна – тие не треба да продолжуваат понатаму во една насока од оние погоре (воопшто ова помогна со редови на радио икони чијашто вистинска големина се тенденција да биде променлива и не беше очигледна , што ги прави доследни значеше дека корисникот не мораше да се грижи за кликнување на колона од копчиња).
  • Различни видови на заеднички икони треба да имаат поставени големини:
    • Опција/Радио/Откажи: 44 x 44
    • Етикети: (0+знаци * 16) x 40
    • Прикажи: (0+знаци * 16) x 52
    • Записници: (8+знаци * 16) x 52
    • Потопени записници: (16+знаци * 16) x 68
    • Мени копче: 44 x 44
    • Приспособени стрели: 32 x 32
  • Иконите не смеат никогаш да го заобиколат работ на видливиот работен простор.
  • Иконите не треба да бидат надвор од видливиот работен простор (додатоци за прозорци кои ги менуваат големини).
  • Иконите не смеат да бидат поставени надвор од степенот на прозорецот.
  • Етикетите покрај Иконите на екранот мора да бидат директно поставени.
  • Етикети Следниве икони на екранот (обично сепаратор за внесување стил “ширина : висина”) треба да биде хоризонтално центриран.
  • Посебни типови на икони мора да имаат одредени знаменски знамиња:
    • Поле за прикажување: Мора да се полни, вертикално и хоризонтално центрирано.
    • Подигнати икони: Не се препорачува.
    • Ограничени икони: Не се препорачува.
    • Групи на канали: Не смее да се пополнуваат, немаат текст или содржина на крипти.
    • Акција/Стандард копчиња: Мора да бидат пополнети, хоризонтално и вертикално центрирани, не е оправдано право, користете сива 1 позадина, црн текст.
    • Пишуваат икони: мора да бидат запишани (т.е. ако изгледаат како запишани, тие исто така мора да дејствуваат како него), мора да бидат пополнети, мора да бидат бела позадина и црн преден план, мора да бидат вертикално центрирани, треба да бидат хоризонтално центрирани.
    • Икони на радиото/опциите: Мора да има прикриени спори кои се наредени ‘off, on’, да се од типот радио, Радио иконите мора да бидат ESG != 0, Иконите за опции мора да бидат ESG 0.
    • Разделувачите: не смеат да се полнат, не смеат да бидат хоризонтално центрирани или право оправдани, мора да бидат вертикално центрирани, не смеат да имаат граница.
    • Икони за Текст+Спрајт (пр. датотеки): не смеат да бидат хоризонтално и вертикално центрирани (освен ако не е оправдано и десно).
  • Полето за дијалог мора да има само едно копче “Стандардно”.
  • На кутијата за дијалог им е дозволено да имаат копчиња кои се порамнуваат лево од делот “под делител”, но само ако постојано се постават. (обично за “отворена помош”, “напредни” или слични копчиња).
  • Копчињата за отпуштање од десната страна на дијалозите никогаш не треба да завршат со елипса.
  • Иконите на етикетата никогаш не смеат да завршат во дебелото црево, ниту простор, ниту пак да бидат префиксирани со празно место.
  • Копчињата треба воопшто да бидат еден збор.
  • Стандардните копчиња никогаш не треба да завршат со елипса.
  • Имињата на прстите не смеат да содржат празни места.
  • Во валидацијата на исправата се дозволени само 2 спрат.
  • Имињата на справите мора да бидат помали од 12 карактери.
  • Знами на прозорецот мора да исполнуваат одредени критериуми:
    • Windows секогаш мора да биде “нов” (RISC OS 2) формат.
    • Windows со икона за затворање секогаш мора да има икона Назад.
    • Windows со наслов и големина секогаш мора да има икона за префрлување.
    • Прозорците со хоризонтален и вертикален свиток треба да имаат икона за промена на големина.
    • Не смее да се менува големината кога не се користи лента за лизгање.
    • Windows не смее да тврди дека е и преден план и позадина.
    • Windows не треба да има поставено знаме за бои (само специјални случаи).
  • Насловите на прозорците не смеат да завршат во дебелото црево или просторот и не смеат да започнат со празно место.
  • Windows треба да се обиде да се прилагоди на соодносот 1.414:1 (што неточно го напишав како “златен сооднос”).

Тоа не се сите правила што ги има – само оние што можев да ги видам (и што мислев интересно). Деталите за овие (и други) заедно со оправдување беа собрани во додаток на водичот за стил. Не знам каде отиде.

Алатката ќе провери за сите овие работи, па дури и поправи некои од нив, така што тоа не е потребно да го стори тоа рачно. Повеќето од работите што ги објавува се корисни совети, дури и ако не сторив ништо за нив. Алатката помогна да се осигура дека сите апликации имаат конзистентен изглед.

Мал дел од излезот при обработката на шаблонот за !Nettle, само покажувајќи ги шаблоните со “отворен” и “големина”.

Template fixer 0.10 (30 Oct 2005). (C) Justin Fletcher
Processing window 'open'
  Icon  0: type 5 ''/'<>'/'Nhost;Pptr_write;Kat;AA-Za-z0-9-. ,:@'
           Writable icon is not H-centred
           Spacing (V) with icon 8 should be 8 OS units (currently 12)
           Spacing (H) with icon 10 should be 8 OS units (currently 4)
  Icon  1: type 8 'Cancel'/'<>'/'R5,3;Ncancel'
           Action/Default button has odd width (recommend 156, default 188, secondary 140)
  Icon  2: type 7 'Connect'/'<>'/'R6,3;Nconnect'
           Action/Default button has odd width (recommend 172, default 204, secondary 156)
  Icon  3: type 4 'Task window'/'<>'/'R2;Ncontype'
           Spacing (H) with icon 5 should be 8 OS units (currently 4)
  Icon  4: type 12 '<>'/'gright,pgright'/'R5;sgright,pgright;Ncontypebut'
           Menu button does not use ptr_menu
           Menu button is R-Justified
  Icon  5: type 0 'Connection'/'<>'/''
           Spacing with window edge should be 12 OS units
  Icon  6: type 5 ''/'<>'/'Pptr_write;Kat;Ncommand'
           Writable icon is not H-centred
           Spacing (H) with icon 11 should be 8 OS units (currently 4)
  Icon  7: type 4 'xterm-colour'/'<>'/'R2;Ntermtype'
           Spacing (H) with icon 9 should be 8 OS units (currently 0)
  Icon  8: type 12 '<>'/'gright,pgright'/'R5;sgright,pgright;Ntermtypebut'
           Menu button does not use ptr_menu
           Menu button is R-Justified
  Icon 10: type 0 'Host'/'<>'/'Nhostlabel'
           Spacing with window edge should be 12 OS units
  Icon 11: type 0 'Command'/'<>'/'Ncommandlabel'
           Spacing with window edge should be 12 OS units
  General:
           Window is not shaped to the golden ratio (width = 192,384 or height = 628,1252)
           Window should not be larger than 800 by 600 OS units
           Window contains 1 Action button and 1 Default button but no divider
Processing window 'resize'
  Icon  0: type 5 '80'/'<>'/'Pptr_write;Ktar;A0-9;Nwidth'
           Spacing (H) with icon 1 should be 8 OS units (currently 4)
           Spacing (H) with icon 8 should be 8 OS units (currently 4)
  Icon  1: type 0 'Width'/'<>'/'<>'
           Spacing with window edge should be 12 OS units
  Icon  2: type 5 '24'/'<>'/'Pptr_write;Ktar;A0-9;Nheight'
           Spacing (H) with icon 3 should be 8 OS units (currently 4)
           Spacing (H) with icon 9 should be 8 OS units (currently 4)
  Icon  3: type 0 'Height'/'<>'/'<>'
           Spacing with window edge should be 12 OS units
  Icon  4: type 5 '96'/'<>'/'Pptr_write;Kta;A0-9;Nscroll'
           Spacing (H) with icon 5 should be 8 OS units (currently 4)
           Spacing (H) with icon 10 should be 8 OS units (currently 4)
  Icon  5: type 0 'Scrollback'/'<>'/'<>'
           Spacing with window edge should be 12 OS units
  Icon  6: type 8 'Cancel'/'<>'/'R5,3;Ncancel'
           Action/Default button has odd width (recommend 140, default 188, secondary 140)
  Icon  7: type 7 'Set'/'<>'/'R6,3;Nset'
           Spacing with window edge should be 12 OS units
           Action/Default button has odd width (recommend 140, default 204, secondary 156)
  General:
           Window contains 1 Action button and 1 Default button but no divider

Одржувањето кон доследен стил е навистина важно за еден производ кој изгледа професионално, а алатката помага да се осигури дека ова останува случај.

ModServices

Назад кога Acorn го издаде Ursula на програмери за тестирање, постоеше алатка која се викаше ursmod, која ќе прикаже детали за модулските услуги и ќе може да ги ажурира модулите од стариот стилски сервис на новите табели на сервисот Ursula. Кога го добивме кодот за оперативниот систем, оваа алатка не беше вклучена, па моравме да направиме со ажурирање на работите со рака.

За да го направите ова полесно, напишав малку алатка наречена ModServices која направи многу слична работа – освен тоа не би го ажурирала модулот со самите услуги. Неговата главна сила, сепак, беше да се лоцира дешифрирање на влезните точки – и (верувам) тоа го стори тоа подобро од алатката Acorn. Не можам да бидам сигурен, бидејќи јас немам оригинален извор, очигледно <smile>.

Како и да е, тој помина низ упатствата за внесување на услугата, за да утврди кои услужни броеви се обиде да ги проверат. Во принцип, повеќето модули (асемблерски) следеа по сличен модел, дури и ако се напишани со рака. Повеќето би направиле една од неколкуте работи:

  • Споредете со непосредна константа. Тоа е најлесно.
  • Одземете или додадете (можеби повеќекратно) во привремен регистер, а потоа да се споредите со непосредна константа.
  • Како погоре, но наместо да се споредува со непосредна константа, поставете ги знамињата врз основа на државата.
  • Вчитајте константа во привремен регистар, а потоа одземете (или додадете) на услугата.
  • Изгради константа користејќи MOV, ADD и SUB, а потоа да се спореди со бројот на услугата.
  • Користете EOR за да ги исчистите битките во привремен регистер и потоа да ги споредувате со константа.

Околу овие упатства што се од интерес, може да има упатства за редење, манипулација со процесорски режим, операции на приватниот збор или неколку други нешта што биле игнорирани. Откако ги разгледа резултатите и достигна очигледна престанок, би било среќно што излезе од вистинските услуги. Ако ги погоди инструкциите, тоа не го разбрало, или аритметичките операции биле само чудни (на пр SUB r14,r1,pc – одземе тековниот програмски бројач од бројот на услугата), ќе се откаже и ќе го означи модулот како неопасен.

Типичниот излез може да изгледа нешто како:

UtilityModule:              &6F, &81
Podule:                     &27, &45
UnSqueezeAIF:               &B7
AppPatcher:                 &B7, &B9
DiagnosticDump:             &DC
CFrontDemangler:            &DC
CLIV:                       &D8
VideoHWVIDC:                &45, &76
VideoHWVF:                  &45, &46, &B9, &E1, &E2, &400C3, &42680
VideoGuard:                 &DE, &DF, &400C0
BufferManager:              &27
Debugger:                 * &27
DMAManager:                 &27, &8E, &8F
RTCAdjust:                  &27
OSPointer:                  &46, &6F, &DE
Hourglass:                  &6
FileSwitch:                 &11, &12, &27, &68, &75, &7D
ResourceFS:                 &40, &75
ResourceFiler:              &27, &4B, &4C, &4F, &5E
Messages:                   &60
MessageTrans:               &59, &5A, &75
TerritoryManager:           &28, &73
UK:                         &64
International:              &43
SerialDeviceDriver:         &27, &70, &71, &77, &81, &8A
SerialDeviceSupport:        &27, &77
Mouse:                      &27
SerialMouse:                &27
PS2Driver:                  &27, &8A
InternationalKeyboard:      &27, &43, &44
FileCore:                   &C, &11, &27, &40, &69, &6A, &6B, &6C, &75
ADFS:                       &27, &8A, &10802
ADFSFiler:                  &27, &4B, &4C, &4F, &5E
RAMFSFiler:                 &27, &4B, &4C, &4F, &5E
CDFS:                       &40
CDFSFiler:                  &11, &27, &4B, &4C, &4F, &5E, &7D
DOSFS:                      &11, &12, &27, &40, &42, &5C, &68, &69, &6A, &6B, &6C
SystemDevices:              &40
PipeFS:                     &40
AIF:                        &40
TransientUtility:           &40
BASIC:                      &11
BASIC64:                    &11
Obey:                       &2A
DDEUtils:                   &27, &53
SysLog:                     &7E, &9F, &B0, &D7, &42680, &80C41
ScreenModes:                &50, &8D, &DE
ScreenBlanker:              &27, &46
ScrSaver:                   &49, &7B, &80, &A9
SoundDMA:                   &27, &8A
SoundChannels:              &27, &54
WaveSynth:                  &54, &59
StringLib:                  &54, &59
Percussion:                 &54, &59
SoundScheduler:             &27, &54
SharedSound:                &54, &42680, &80481
DeviceFS:                   &27, &40
ParallelDeviceDriver:       &27, &70, &71, &79, &8A
ColourTrans:                &27, &46, &59, &5C, &72
Draw:                       &27
SpriteExtend:               &27, &59, &72, &42680
InverseTable:               &27, &46, &59, &5A, &72, &73
DrawFile:                   &60, &80D60, &80D61, &80D62
FontMap:                    &60, &6E
ZLib:                       &53, &42680
PNG:                        &53, &42680
ROMFonts:                   &60
FontManager:                &27, &41, &46, &57, &64
ImageFileConvert:           &80D40, &80D41, &80D42
CompressJPEG:               &42680, &80D60, &80D61, &80D62
ConvertPNG:                 &80D60, &80D61, &80D62
ConvertBMP:                 &42680, &80D60, &80D61, &80D62
ConvertGIF:                 &46, &80D60, &80D61, &80D62
ConvertICO:                 &42680, &80D60, &80D61, &80D62
ConvertPNM:                 &42680, &80D60, &80D61, &80D62
ConvertSprite:              &80D40, &80D41, &80D42, &80D60, &80D61
ConvertSun:                 &42680, &80D60, &80D61, &80D62
ConvertXBM:                 &80D60, &80D61, &80D62
ConvertPCX:                 &42680, &80D60, &80D61, &80D62
ConvertClear:               &80D60
ImageFileRender_Artworks:   &80D40, &80D41
Zipper:                     &53, &42680
PrinterBuffer:              &6F
PDriver:                    &78
PDriverDP:                  &46, &57, &65, &78
PDumper24:                  &66
PDumperCX:                  &66
PDumperDM:                  &66
PDumperE2:                  &66
PDumperIW:                  &66
PDumperLJ:                  &66
PDriverPS:                  &46, &57, &65, &78
RemotePrinterSupport:       &95, &96
RemotePrinterMessages:      &60
WindowManager:              &27, &2A, &46, &59, &5A, &60, &6D, &72
FilterManager:              &86
RedrawManager:              &87, &88
IconBorderPlain:            &87
IconBorderRound:            &46, &72, &87
TaskManager:                &27, &46, &49, &4A, &4B, &4E, &4F, &5E, &90, &91, &92, &42680
ShellCLI:                   &11, &27, &53
DisplayManager:             &27, &46, &49, &4A, &5B, &5D, &94
Filer:                      &27, &49, &4A, &5E, &75, &7D, &801C8
FilerSWIs:                  &53
Filer_Action:               &11, &27
Free:                       &27, &49, &4A, &4E
Pinboard:                   &11, &27, &49, &4A, &4B
ClipboardHolder:            &49, &4A
WindowScroll:               &49, &4A
ColourPicker:               &46, &53, &59, &5D, &75, &93
TaskWindow:                 &11, &27, &53, &57, &72, &CC
NetStatus:                  &27
MbufManager:                &A1, &42680
Internet:                   &45, &5E, &9D, &A2, &55640
InetServices:               &80C41
Resolver:                   &9D, &9F, &A1, &B0, &80C41
MimeMap:                    &80C41
InternetTime:               &9F, &A1
InetConfigure:              &9D, &9F
DHCPClient:                 &9D, &9F, &A1, &B0
ZeroConf:                   &9D, &9F, &A1, &B0
RouterDiscovery:            &9D, &9F, &A1, &B0
Freeway:                    &9D, &9F, &B0
FreewayHosts:               &80, &95, &80C41
ShareFS:                    &40, &4B, &4C, &4F, &73, &7D, &80, &95, &96, &9F, &B0, &801C1
LanManFS:                   &40, &60, &9D, &9F, &A0, &B0, &80C41
AppleTalk:                  &40, &9D, &A0, &A1, &A2, &42680
Toolbox:                    &11, &53, &60, &73, &87, &92
Window:                     &46, &49, &60, &80, &A5, &44EC0, &44EC1, &44EC2, &44EC3
Menu:                       &60, &44EC0, &44EC1, &44EC2, &44EC3
Iconbar:                    &60, &44EC1, &44EC2, &44EC3
ColourDbox:                 &60, &44EC0, &44EC1, &44EC2, &44EC3
ColourMenu:                 &60, &44EC0, &44EC1, &44EC2, &44EC3
DCS:                        &60, &44EC1, &44EC2, &44EC3
FileInfo:                   &60, &44EC1, &44EC2, &44EC3
FontDbox:                   &60, &6E, &44EC1, &44EC2, &44EC3
FontMenu:                   &60, &44EC0, &44EC1, &44EC2, &44EC3
PrintDbox:                  &60, &44EC1, &44EC2, &44EC3
ProgInfo:                   &60, &44EC1, &44EC2, &44EC3
SaveAs:                     &60, &44EC1, &44EC2, &44EC3
Scale:                      &60, &44EC1, &44EC2, &44EC3
GDivider:                   &60, &82881
ToolAction:                 &46, &60, &82881
TextGadgets:                &46, &5D, &44EC6, &82881
ImageFileGadget:            &46, &5D, &60, &44EC6, &82881
CDFSResources:              &60
CDFSSoftATAPI:              &42680
LegacyBBC:                  &4
LegacyScreen:               &46, &DE
BBCEconet:                * &27
OwnerBanner:                &7C, &CF
!Alarm:                     &60
LibraryHelp:                &D6
RPCEmuHostFS:               &40
RPCEmuHostFSFiler:          &27, &4B, &4C, &4F
VProtect:                   Dunno? &059f168c at 0225f1cc, offset &00000678
VProtect:                 ? &49, &7C, &4A, &27, &7, &400, &C0FFEE, &DECAFF
BootLog:                    &49
ErrorLog:                   &400C0, &400C2, &42680
ROMPatch:                   &45
AcornURI:                   &27, &49, &4A, &53
AMPlayer:                   &54, &80, &92
LineEditor:               * &53, &27
WimpSWIVe:                * &27
NoCoverIB:                - 
Tiler:                      &7C
StartBanner:                &7C
TransTIFF:                * &8004C
!StrongHelp:               * &40, &11
ZapRedraw:                * &46
!Zap:                        &27, &49, &4A, &53, &7F
ControlAMPlayer:            &87, &89, &52E00
AcornSSL:                   &83E01
MIDI:                     * &45, &27, &54
MIDISynthesiser:          * &58

Каде:
* укажува на збир на услуги кои беа декодирани од управувачот, а не табелата за модулите на Ursula.
- покажува празен ракувач со услуги.
? укажува на непроменлив управувач со услуги.

Единствениот “нераменлив” модул во горенаведената депонија е VProtect кој има доста комплицирана секвенца за внесување на услуги – и онаа што јас намерно не се обидов да ја поддржам, бидејќи тоа е еден од потешките случаи, и сите други модули кои ги пробав работеше добро.

Само за сите ROM-модули, и повеќето модули за поддршка, беа обновени во новиот формат со проверка со алатката. Една друга мала функција која поддржаната алатка ја филтрира по услуга број. Ова значеше дека можете да му дадете број на услуга, и ќе ги пријави само резидентните модули кои ја обработувале таа услуга – корисно за стеснување на опсегот на проблемот.

ROMEdit

Градење на ROM само поради тоа што сакате да додадете неколку нови модули за тестирање, или да го исклучите нешто што не е доста работа за вас е доста фрустрирачко. За време на подоцнежните 32-битни работи имаше неколку пати кога беше навистина корисно да се има достапна алатка за тестирање во ROM-от – особено кога немавте диск или мрежа за да ја добиете програмата (користев сериски влез некои од времето за брзо зграпчување на програмата, но имајќи го во ROM-от, подготвено за користење, беше многу полесно).

Околу Select 3, додека работев на алатката BuildROM, напишав алатка за придружник, !ROMEdit. Ова беше алатка за десктоп и командна линија која ви овозможи да ја преземете ROM-та, да ја смените неговата содржина и да ја зачувате во нова датотека. Модулите може да се отстранат или да се додадат, апликациите или библиотечните алатки може да се додадат во ResourceFS, и Kernel може да се замени – ова беше пред додавањето на SystemInit (иако би било разумно да се додаде и поддршка за замена на SystemInit).

Десктоп алатката ви овозможува да ги видите сите корисни содржини на ROM-от и повторно да ја зачувате, или можете да зачувате датотека “држава” која ја опишува моменталната конфигурација. Датотеката за конфигурација потоа може да се вчита повторно за да ги репродуцира истите промени, или да се уредува рачно за да направат мали промени.

Примерна датотека со податоци која лежеше наоколу:

# ROMEdit state file
# Syntax:
#    ROM <file>
#       - select the ROM to work with
#    Omit <module name>
#       - force a module to be removed from the ROM
#    AddMod <file>
#       - add a module to the ROM
#    AddLib <file>
#       - add a library file to the Library resources
#    AddApp <dir/app>
#       - add an application or directory to the Apps resources
#    ReplaceKernel <file>
#       - SReplace the kernel in the image
#    Save <file>
#       - save the resulting image to a file
#    SaveSquashed <file>
#       - save the resulting image to a file in compressed form
ROM ADFS::Virginia.$.!Boot.Softload.Adjust1i2
Omit IconBorderRound
Omit ZeroConf
Omit LibraryHelp
AddApp Share::ROMEdit.$.!ROMEdit
AddLib Share::ROMEdit.$.ROMEdit
AddMod ADFS::Virginia.$.Build.RISCOS.Sources.HWSupport.Joystick.rm.Joystick
Save ADFS::Virginia.$.!Boot.Softload.ROM

Верзијата на командната линија беше корисна бидејќи можеше да се користи за да обезбеди брзи модификации сигурно и може да се користи под Linux за лесно менување на ROM-от (иако компресијата не била користена во тој случај). Алатката беше многу корисна за брзо свртување при работа со 32-битна верзија во QEmu.

A ROM loaded into the ROMEdit tool

Промена на конфигурацијата на ROM-от беше прилично едноставна, само означете го модулот за да го исклучите.

Ажурирање: 2013-07-12

© Сopyright Justin Fletcher