Page 1 of 1

Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Tue Dec 02, 2014 11:19 am
by ALPINE
Здравствуйте. Пишу игру на конкурс. Вчера наконец-то скомпилировал Hello World и это радует. Сейчас готовлюсь к выводу графики и столкнулся с нестыковкой в один пиксель с границей окна. Окно со скином, и, согласно документации, система рисует его так:
- рисуется внешняя рамка шириной 1 пиксель цвета 'outer' из скина
- рисуется промежуточная рамка шириной 3 пикселя цвета 'frame' из скина
- рисуется внутренняя рамка шириной 1 пиксель цвета 'inner' из скина
- рисуется заголовок (по картинкам из скина) в прямоугольнике (0,0) - (xsize,_skinh-1)
Итого получается, что рамка слева, справа и снизу имеет толщину 1+3+1=5 пикселей, сверху - _skinh пикселей.

Я хочу получить рабочую область 400х250, поэтому создаю окно на 10 пикселей шире и на 5+_skinh пикселей выше, вот так:

Code: Select all

	area_width = 400;
	area_height = 250;

	window_width = area_width + 10; // 5px border (left + right)
	window_height = kol_skin_height() + area_height + 5; // bottom 5px border + title
Создаю окно, вывожу прямоугольник 400х250 в точке (0,0) и получаю:

Image

Справа и снизу имеется нестыковка в один пиксель. То есть окно получилось на 1 пиксель шире и выше, чем надо (видно, как просвечивает фон и окно на заднем плане). Это баг или так задумано? Мне не тяжело отнять единичку при создании окна, но я не уверен, правильный ли это будет поступок.

Второй вопрос про события клавиатуры.

Я правильно понимаю, что ловится только событие нажатия? Отжатия (KeyUp) в принципе нет? Если это так, то я буду пытаться "угадать" отжатие в момент, когда прекратится поток событий от зажатой клавиши, но для этого мне нужно знать задержку перед авто-повтором и период авто-повтора. Я кажется нашёл их в /kernel/branches/Kolibri-acpi/drivers/usbhid, это они? Они всегда будут фиксированными?
; 1h. Start the new autorepeat timer with 250 ms initial delay
; and 50 ms subsequent delays.

Re: Вопрос про рамку окна (нестыковка в 1 пиксель) и про Key

Posted: Tue Dec 02, 2014 11:35 am
by Mario_r4
1) Добро пожаловать в порочный и удивительный мир legacy кода. Это унаследовано от MenuetOS. Не правим ядро потому что нужно править 100500 приложений. Причем изменения будут не совсем тривиальными. Еще такая же фигня есть с размерами кнопки - ф.8.
2) Читать описание ф.2 и ф.66 - в части касающейся сканкодов.

Re: Вопрос про рамку окна (нестыковка в 1 пиксель) и про Key

Posted: Tue Dec 02, 2014 1:58 pm
by ALPINE
1) То есть нужно отнимать единицу и таким образом фиксить неисправимый баг, правильно?
2) Ага. Я про сканкоды сначала не стал читать, решив, что там только про их преобразование в ASCII. А оказалось, что в 15-м бите информация о том, нажат он или нет. Спасибо.

А сканкоды безопасно использовать? На других клавиатурах с другими драйверами сканкоды останутся прежними?

Re: Вопрос про рамку окна (нестыковка в 1 пиксель) и про Key

Posted: Tue Dec 02, 2014 2:04 pm
by Mario_r4
1) Да.
2) Да.

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Wed Dec 03, 2014 1:09 pm
by Nikolai1
Добро пожаловать в порочный и удивительный мир legacy кода. Это унаследовано от MenuetOS. Не правим ядро потому что нужно править 100500 приложений. Причем изменения будут не совсем тривиальными. Еще такая же фигня есть с размерами кнопки - ф.8.
В разработке ядра и в ассемблере я конечно мало что понимаю, но ведь можно создать новую системную функцию на основе существующей для создания окна, в ней уже исправить баги. старые приложения будут работать, используя старую функцию, а в тех, что будут создаваться можно пользоваться новой.

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Wed Dec 03, 2014 1:26 pm
by Mario_r4
Nikolai1 wrote:В разработке ядра и в ассемблере я конечно мало что понимаю, но ведь можно создать новую системную функцию на основе существующей для создания окна, в ней уже исправить баги. старые приложения будут работать, используя старую функцию, а в тех, что будут создаваться можно пользоваться новой.
Можно. Создавайте.

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Wed Dec 03, 2014 5:06 pm
by Nikolai1
Можно. Создавайте.
Да я бы с радостью :wink: но в ассемблере почти не разбираюсь. куда уж мне в ядре копаться

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Wed Dec 03, 2014 5:29 pm
by Mario_r4
Nikolai1 wrote:Да я бы с радостью :wink: но в ассемблере почти не разбираюсь. куда уж мне в ядре копаться
Не боги горшки обжигают.

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Wed Dec 03, 2014 11:18 pm
by yogev_ezra
Nikolai1 wrote:
Можно. Создавайте.
Да я бы с радостью :wink: но в ассемблере почти не разбираюсь. куда уж мне в ядре копаться
Пришли мыши к мудрой сове попросить совета, как им избежать участи быть съеденными обнаглевшими котами. Сова говорит им:
- Станьте ежиками. Если вы будете колючими, вас никто не съест!
Обалдевшие от восторга мыши побежали домой, там опомнились и снова вернулись к сове:
- Сова, расскажи - а как нам стать ежиками?
А Сова им в ответ:
- Мыши! Как – разбирайтесь сами! Мое дело – стратегия!

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Tue Jan 27, 2015 4:44 pm
by buyerninety
"Вопрос про нестыковку в 1 пиксель"
Создаю окно, вывожу прямоугольник 400х250 в точке (0,0) и получаю:
Image
Справа и снизу имеется нестыковка в один пиксель. ...
Таким образом, вы сделали окно, содержащее градиент цвета - вместо
сделать это содержащий сетку (для удобства просмотра сделать линии сетки
есть цвет, например, зеленый), линии сетки в первом положении пикселя, на
десятая позиция пикселей, на двадцатой позиции пикселя.
Затем проверьте - может видеть десятый и двадцатый линии сетки? Да -
то линии сетки работает. Теперь, мы можем увидеть первые линии сетки?
Если нет, то, возможно, первой сетки линия покрыта какой-то «внешней рамы /
промежуточный кадр / внутренняя рама» элементов. Если это так, увеличить
Размер линии сетки вверх от одного пикселя, до, возможно,
появляется первая позиция линии сетки.
также (так как ширина и высота установлен).
Такая процедура может служить, чтобы дать подсказки о том, где искать
для устранения неисправности в коде.
So you made a window containing a colour gradient - instead
make it containing a grid (for ease of viewing make grid lines
have colour e.g. green), grid lines at the first pixel position, at
the tenth pixel position, at the twentieth pixel position.
Then check - can see the tenth and twentieth grid lines? Yes -
then grid lines are working. Now, can we see the first grid line?
If no, then perhaps the first grid line is covered by some 'outer
frame/intermediate frame/inner frame' elements . If so, increase
the size of the grid line upwards from one pixel, until perhaps
first position grid line appears.
These grid lines vertical, concurrently make horizontal grid lines
also (so both the width and height are checked).
Such procedure may serve to give clues as to where to look
for the fault in the code.

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Fri Jan 30, 2015 7:54 am
by buyerninety
- рисуется внешняя рамка шириной 1 пиксель цвета 'outer' из скина
- рисуется промежуточная рамка шириной 3 пикселя цвета 'frame' из скина
- рисуется внутренняя рамка шириной 1 пиксель цвета 'inner' из скина
- рисуется заголовок (по картинкам из скина) в прямоугольнике (0,0) - (xsize,_skinh-1)
На самом деле, глядя теперь на картинке под XP лупа, не вижу какой-либо
"рисуется внутренняя рамка шириной 1 пиксель цвета 'inner' из скина".
Сравнение с внутренняя рамка окна Eolite, которая рядом с ним,
по-видимому, показывают, что ваше окно отсутствует внутренняя рамка на
правой и нижней, и, возможно, слева, а. (Верхний внутренний линию рамки,
кажется, присутствует.)
Если вы обнаружите в коде этого окна, причины неисправности, пожалуйста,
поделиться. Причина не смущать, но, скорее, похожи или же вина
- в программах TABLE и TANKS (не LaserTank).

Re: Вопрос про нестыковку в 1 пиксель и про KeyDown (решено)

Posted: Sat Jan 31, 2015 3:50 pm
by ALPINE
Please write in English only. Google Translate sucks.

I don't have time to debug this code, but maybe one day I will code some stuff for KolibriOS and figure out what's going on about this 1-pixel glitch.