Приветствую всех в этой теме.Я хочу вас научить редактировать и создавать свои скрипты для gfxboot формата inc.
Вам известно, что inc скрипты отвечают за многие вещи в вашей теме, так давайте разберём некоторые из них.
Quote (BEGFRAET)
Правила этой темы включают:
1.Разрешается Давать inc код в bbcod [code] [\code]
2. Запрещается создавать ответ с такими словами как спасибо, пожалуйста, и. т. Д. Но комментировать статьи и задавать вопросы – разрешено ! 3. Также чтоб дать ответ или задать вопрос надо выполнить д. з. из урока Я снимаю это правило (Оно глупое)!
Для создателей уроков
4. Надо создавать грамотный материал (т. Е. без ошибок) и в конце каждого урока создавать своё домашнее задание по вашей теме. 5. Запрещается создавать материал не по теме: “Редактирования и создание inc скриптов”.
Описание языка, используемого в скриптах для gfxboot
Как в gfxboot сделать пропускаемые строки меню. (из топика "Темы gfxboot (загрузочные темы для gfxmenu)")
1. Делаем резервную копию своего main.inc
2. Открываем main.inc в текстовом редакторе.
3. Поиском по тексту находим образец "/main.input" (без кавычек разумеется) - это начало скрипта, обрабатывающего нажатия клавиш - открывающая фигурная скобка, идущая после указанного текста, показывает начало скрипта - закрывающая скобка, соответствующая данной (все фигурные скобки парные, поэтому удобно использовать редактор с подсветкой синтаксиса) сопровождена словом } def и расположена после блока
Code
dup 0 ne { pop 0 } if
- внутри этого скрипта анализируются нажатия различных клавиш. Поскольку код нажатой клавиши сравнивается с кодами подлежащими обработке, то скрипт состоит из набора блоков "if", которые ограничены командами вида
Code
dup ПроверяемыйКОД eq { .... .... pop 0 } if
Нас будут интересовать блоки от keyUp и keyDown.
4. Если все вышесказанное понятно и Вы идентифицировали все блоки, то можно приступать к модификации скрипта. - НАЧАЛО СКРИПТА. Блок ...
dup keyUp eq { menu.entry 0 gt { menu.entry false MenuSelect menu.entry menu.shift eq { /menu.shift menu.shift 1 sub def main.drawmenu } if /menu.entry menu.entry 1 sub def menu.entry true MenuSelect } if pop 0 } if
... заменяем на ...
Code
dup keyUp eq { menu.entry 0 gt { menu.entry false MenuSelect menu.entry menu.shift eq { /menu.shift menu.shift 1 sub def main.drawmenu } if /menu.entry menu.entry 1 sub def /s.repeat keyUp def % ded menu.entry true MenuSelect } if pop 0 } if
- БЛОК keyDown...
Code
dup keyDown eq { menu.entry menu.texts length 1 sub lt { menu.entry false MenuSelect menu.visible.entries menu.entry menu.shift sub sub 1 eq { /menu.shift menu.shift 1 add def main.drawmenu } if /menu.entry menu.entry 1 add def menu.entry true MenuSelect } if pop 0 } if
... заменяем на ...
Code
dup keyDown eq { menu.entry menu.texts length 1 sub lt { menu.entry false MenuSelect menu.visible.entries menu.entry menu.shift sub sub 1 eq { /menu.shift menu.shift 1 add def main.drawmenu } if /menu.entry menu.entry 1 add def /s.repeat keyDown def % ded menu.entry true MenuSelect } if pop 0 } if
- КОНЕЦ СКРИПТА. Блок ...
Code
dup 0 ne { pop 0 } if } def
... заменяем на ...
Code
dup 0 ne { pop 0 } if s.repeat 0 ne { menu.texts menu.entry get "---" eq { s.repeat main.input } { menu.entry true MenuSelect } ifelse } if % ded } def
5. "[b]---" - это образец строк меню, которые должны пропускаться при движении вверх/вниз. Можете задать свой вариант, например 7 пробелов. Обратите внимание, что первый пробел после "title" служебный и не является частью строки меню. Совпадение должно быть точным, т.е. "---" и "--- " не одно и то же.
6. Сохраните изменения в main.inc, перекомпилируйте gfxboot тему, добавьте в menu.lst команды title --- configfile /menu.lst и тестируйте.
@DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ
Сообщение отредактировал ded2007 - Пятница, 15.04.2011, 13:13
Всем доброго времени суток. Сам из личного опыта пытаюсь сводить все к компактности, поэтому пользовался длительное время ядром скомпилированным gfxboot-3.3-custom. Правда сейчас очень заинтересовался внесением в этот код функции "Time" из @DED-LEGO@ (НЕ аналоговый вариант!). Вывод времени в формате "чч:мм:сс" с возможностью изменять положение и цвет фона/чисел. Как упомянул уважаемый ded2007 код сам по себе не сложный.
Хотелось бы как-то оформить эту функцию в отдельном .inc файле, автономном (чтобы его можно было прикрутить к любым исходникам любому пользователю). Сейчас использую версию от Alser, очень нравится его компактность и минимализм. (Файлы исходники с изменениями прикреплены). Единственное заменен шрифт на классический, и закомментирована строка вывода цифрового таймера (у меня она плохо работает, цифры таймера накладываются друг на друга).
Описывать свои попытки вырезать функцию TIME из @DED-LEGO@ не стал, потому как сам понимаю что функция должна быть написана заново, что мне самому и не по силам.
Обработка нажатий клавиш, действия при открытии (инициализации) gfxboot, действия по таймауту. Как при написании inc-скриптов повлиять на обработку подобных событий? Например, в описании языка скриптов для gfxboot есть функция time, которая, судя по ее описанию, помещает в стек количество секунд прошедших с полуночи. Допустим, мы напишем скрипт, который переводит эти секунды в часы, минуты и секунды и выведем результат. Но через секунду показания изменятся и результат уже будет неверным, значит нам нужно «привязаться» к обработке событий связанных с системными часами. Как же это делается? Если мы дадим скрипту произвольное имя, то как компилятор определит, что это событие нужно связать с системными часами? Решение заключается в использовании ПРЕДОПРЕДЕЛЕННЫХ имен. В вышеназванном описании одним из первых идет раздел ”Callbacks”, в котором описано назначение нескольких функций с ПРЕДОПРЕДЕЛЕННЫМИ ИМЕНАМИ. Рассмотрим две из них -Timeout и Timer. Обе они связаны с системными часами (точнее с прерыванием INT 8h). В подробности архитектуры вдаваться не будем, просто примем как факт, что при каждом прерывании INT 8h, вызываются скрипты с именами Timeout и Timer. Скрипт Timeout предназначен для реализации автозапуска пункта меню. Он регулярно вызывается, но только до первого нажатия клавиши или собственно срабатывания автозапуска пункта меню. Стартовое значение устанавливается тем менеджером загрузки, который вызывает gfxboot. (В нашем случае grub4dos передает значение timeout из menu.lst). Таким образом, Timeout не подходит для наших целей, т.к. часы «остановятся» при первом же нажатии на клавиатуру. Скрипт же Timer – это то, что нам надо, он вызывается при каждом прерывании INT 8h, без всяких «если». Прерывание INT 8h случается приблизительно 18,3 раза в секунду (точнее 1193180/65536). Это даже чаще, чем нам надо. Но в этом есть и свой минус. Если наш алгоритм выполняется дольше, чем 1/18.3=0,055 сек. Например, длительная перерисовка на экране, то налицо реальный риск повторного входа в процедуру обработки еще до окончания предыдущего действа. Думаю, что проще всего защититься от подобных «накладок» с помощью «флага» - переменной, которая разрешает или запрещает начало работы алгоритма. @DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ
Сообщение отредактировал ded2007 - Пятница, 07.10.2011, 20:04
Попробуем все эти мысли объединить в скрипте. 1. Итак, скрипт должен иметь имя Timer:
Code
/Timer { pop
} def
pop – это мы сбрасываем значение, которое помещается в стек при вызове Timer. То, что это необходимо я выяснил экспериментально (иначе сразу следует переполнение стека), а вот, что там за значение, выяснить не удосужился , а в описании этого нет.
2. Реализуем флаг, который разрешает вход в скрипт
Code
/Timer { pop flag 0 ne { % вход разрешен, только если flag не равен 0
} if } def
Code
/Timer { pop flag 0 ne { % вход разрешен, только если flag не равен 0 /flag 0 def % запретим повторный вход до окончания алгоритма % здесь алгоритм... /flag 1 def % разрешим вход } if } def
Смотрите, когда работает алгоритм, флаг все время запрещает повторное начало алгоритма. А по окончании обработки разрешение на вход восстанавливается.
Осталось разобраться с самим алгоритмом. 3. Вот тут как раз таки «подводный камень». По описанию, функция time возвращает в стеке количество секунд с полуночи, а фактически это «счетчик тиков» с полуночи. Тех самых «тиков», которые 18,3 раза в секунду . Плюс еще и число 18,3 не совсем точное, плюс некоторые проблемы из-за целочисленной арифметики. И все таки ...
Code
/ticks_total time def % тиков с полуночи /hh ticks_total 65543 div def % текущий час /ostatok ticks_total hh 65543 mul sub def /mm ostatok 1092 div def % текущая минута /ostatok ostatok mm 1092 mul sub def /ss ostatok 16384 mul 298295 div def % текущая секунда
65543 – число тиков в одном часу, 1092 –в одной минуте, а 16384/298295 это 1/18,3.
4. Осталось подготовить (зачистить) место на экране…
0xffffff setcolor ss mm hh "%02d:%02d:%02d" s.print.buf sprintf s.print.buf show
Code
/Timer { pop flag 0 ne { % вход разрешен, только если flag не равен 0 /flag 0 def % запретим повторный вход до окончания алгоритма
/ticks_total time def % тиков с полуночи /hh ticks_total 65543 div def % текущий час /ostatok ticks_total hh 65543 mul sub def /mm ostatok 1092 div def % текущая минута /ostatok ostatok mm 1092 mul sub def /ss ostatok 16384 mul 298295 div def % текущая секунда
0xffffff setcolor ss mm hh "%02d:%02d:%02d" s.print.buf sprintf s.print.buf show
/flag 1 def % разрешим вход } if } def
6. Ах, да! Еще начальные значения. Они размещаются за пределами скрипта Timer.
Code
/flag 1 def % разрешаем первичный вход /s.print.buf 128 string def % буфер для вывода текста
7. Все это сохраняем в файл с именем, скажем, clock.inc там же где и остальные inc-и. А что бы он «подхватился» при компиляции, в файле boot.config дописываем строчку %% include clock.inc
8. Компилируем и пробуем.
PS. За счет простоты кода имеем 17 бесполезных перерисовок из каждых 18! PSS. Дефектом алгоритма (из-за целочисленной арифметики) является не совсем точное отбражение секунд. Сравните показания в QEMU c реальным временем.
Замечательная статья. Не знаю как будет работать код если включать его в компиляцию последним, поэтому решил попробовать вписать до common но после timeout.
Code
%% include timeout.inc %% include clock.inc %% include common.inc
Посчитал, что так будет разумней исходя из того что timeout должен идти до common
И для смены цвета под фоновую картинку достаточно изменить значение цвета фона в hex в коде:
Code
0x000000 setcolor
Черный Фон. На скриншоте ниже, я изменял это значение на нужное мне "CFCFCF" - светло серое.
А для смены цвета самих цифр:
Code
0xffffff setcolor
Белые цифры. В моей версии это значение равно "000000".
Чистая компиляция с первого раза, показатель грамотного кода. Спасибо. В процессе наблюдения в QEMU заметно отставание на пол секунды от реального времени. О чем Вы и предупреждали.
Вот как выглядит готовый результат:
Осталась небольшая мелочь, нужно задать координаты X и Y для смены местоположения на экране. В таком виде координаты берутся x=1, y=1 (первый пиксель, начальная позиция в левом верхнем углу).
UPDATE: Поправка Из-за своей неопытности не разглядел участок кода. Для изменения положения нужно лишь изменить команду, идущей после установки значения цвета фона:
Code
0 0 moveto
Где первый ноль, это координата X, второй соответственно Y. Для себя я установил значения: x=700, y=4.
UPDATE: Ошибка Только сейчас заметил, секунды и минуты идут точно, но часы запаздывают на 3 часа. Пока я пишу это сообщение имею 23 часа, скрипт же показывает 20... где-то в подсчете тиков не точность я полагаю.
Хочу дождаться полуночи и посмотреть как изменится подсчет количества тиков после наступления полуночи.
Сообщение отредактировал McRex - Суббота, 08.10.2011, 01:13
McRex, c цветами Вы определились верно, координаты не (1;1), a (0;0) их видим в команде 0 0 moveto
Команда %% include нужна для компилятора и если в подключаемом inc-модуле нет ссылок на другие модули, то ее расположение в boot.config может быть произвольным. Кстати, команду %% include можно использовать и в inc-модулях, а вот boot.config служит "отправной точкой" для компилятора.
Что касается времени, то у меня совпадает. Проверим: 1 час=60сек*60мин*18,3=3600*(1193180/65536)=65543,3349609375 тиков 1 минута=60сек*18,3=60*(1193180/65536)=1092,388916015625 тиков 1 секунда=1*(1193180/65536)=298295/16384 тиков Проверьте и Вы . Проведите, кстати, эксперимент влияет ли изменение часов в Windows на показания в виртуальной машине (без перезапуска)
С координатами я опередил Вас на пару секунд, но все равно спасибо что указали на ошибку, я и правда изначально искал координаты равные 1, и лишь потом обратил внимание на эту строку. После наступления полуночи на системном времени у меня 00, виртуальная машина оставалась запущена в этот момент и время в ней перешло в значение 21. Разве количество тиков не должно было обнулиться? Изменения системного времени в ручную без перезапуска QEMU ни к чему не приводят. Скрипт не изменяет время. Даже перезапустив QEMU он реагирует лишь на изменение минут или секунд, но не часов. Я в замешательстве...
UPDATE Только что произвел загрузку компа с usb. Время отобразилось правильно. Предполагаю что все проблема в том что использовал QEMU через WinSetupFromUSB 1-0-beta7. Потому как даже после полной перезагрузки время в виртуальной машине не изменилось.
Большая признательность и благодарность за помощь
Сообщение отредактировал McRex - Суббота, 08.10.2011, 01:41
Сегодня доделал программу, которая способна помочь при создании gfxboot.cfg,. Кодовое название GGM или GrubGfxMenu. Скачать можно с сайта скачать. Обсуждение на форуме программы. Форум
Доброго времени суток дамы и господа! https://r-notebook.ru/ Сервисный центр «Р-Ноутбук» срочно придет на помощь, если у вас сломался ноутбук или ультрабук. Вы можете вызвать мастера, если техника не включается, зависает или тормозит, выдает ошибки. Он оперативно устранит неисправность и предоставит гарантию до 1 года, которая действует на услуги и комплектующие.Специалисты сервиса обладают значительным опытом в сфере ремонта ноутбуков. Они восстанавливают девайсы разных брендов и моделей. Большинство неисправностей инженеры ликвидируют на дому клиентов в Москве. Если поломка серьезная – они бесплатно доставят технику в мастерскую. Мы выполняем программный и аппаратный ремонт девайсов, проводим чистку с заменой термопасты, апгрейд. Стаж и квалификация наших сотрудников позволяют оперативно ликвидировать поломки любой сложности. Более подробная информация о том, чем мы занимаемся, здесь: https://r-notebook.ru/. Хорошего дня!
Добавлено (12.04.2023, 07:23) --------------------------------------------- Здравствуйте господа! https://r-notebook.ru/ Сервисный центр «Р-Ноутбук» специализируется на ремонте ноутбуков и ультрабуков разных брендов и моделей в Москве. Мастера оказывают полный комплекс услуг: восстанавливают работоспособность девайсов, чистят компоненты техники от пыли, устанавливают программное обеспечение, удаляют вирусы и делают апгрейд. Наши сотрудники и специалисты со стажем от 5 лет, поэтому 90% поломок они устраняют в день обращения. Обратиться в сервис можно с любыми проблемами техники. Мы починим ноутбук, если он не включается, тормозит, зависает или показывает синий экран, а после ремонта предоставим гарантию на работы и запчасти, которые использовали для замены. Полный перечень услуг указан на нашем сайте https://r-notebook.ru/. Увидимся!