Смотрелка скинов под Windows

All that makes Kolibri beautiful outside while we are working inside
  • Ого!! Классно!)
    Технологии меняют мир, а я - меняю технологии.
  • Появилась реакция на кнопки закрытия и минимизации.
    Теперь название скина выводится в заголовок.
    Spoiler:
    skins_with_caption.PNG
    skins_with_caption.PNG (75.84 KiB)
    Viewed 11143 times
    skins_with_caption1.PNG
    skins_with_caption1.PNG (82.88 KiB)
    Viewed 11143 times
    sknview.7z (38.1 KiB)
    Downloaded 317 times
  • Мм, жир. Идея с названием в заголовке отличная.
    Из хаоса в космос
  • Мне кажется заголовок на пару пикселей выше чем в системе. Я сужу по win 3.11. Или мне кажется?
    Из хаоса в космос
  • Leency, да, так и есть.
    Spoiler:
    1.PNG
    1.PNG (21.35 KiB)
    Viewed 11129 times
    Только странно, что при этом позиция по горизонтали — верная, а не на 2 пикселя левее.
    Функция dtext ожидает координаты в ebx

    Code: Select all

    ; ebx = output coordinates XXXXYYYY h
    Вот код из DrawCaption

    Code: Select all

        movzx ebx, Skin.Margins.Left
        shl ebx, 16
        mov bx, Skin.Margins.Top
    Я беру ровно значения из Skin.Margins, ничего от себя не прибавляя.
    Для меня это больше похоже на баг с выводом заголовка в самой KolibriOS.
    Ну а скины, возможно, потом стали просто "подгонять" лишь бы работало, не обращая внимания на возможный баг в системе.

    Если это действительно баг — нужно править Margins в скинах или написать в документации, что реальные координаты Margins.Top на 2 пикселя ниже, первое сделать будет правильнее, хотя и дольше.
  • Я понял. Скорее всего это "костыль" в ядре добавленный после увеличения шрифта в заголовке, чтобы не фиксить сами скины.
    Я бы этот костыль убрал.

    P.S. Любой эмуль должен эмулировать также баги системы)
    Из хаоса в космос
  • Leency wrote:Скорее всего это "костыль" в ядре добавленный после увеличения шрифта в заголовке
    Возможно, что так. Или просто проблемы с расчётом координаты Top.
    Смотрим вот тут: http://websvn.kolibrios.org/blame.php?r ... #line-2234
    Фактически, формула примерно такая:

    Code: Select all

    Top = (_skinh - _skinmargins.bottom - _skinmargins.top) / 2 + _skinmargins.top - 8
    Причём, для некоторых скинов работает правильно
    Spoiler:
    1.PNG
    1.PNG (11.63 KiB)
    Viewed 11121 times
    Для окна без скина http://websvn.kolibrios.org/blame.php?r ... #line-2250

    Code: Select all

    5926 	pathoswith 	2250	mov     ebx, 80002h
    В координату Top заранее заносится значение 2.
    Leency wrote:P.S. Любой эмуль должен эмулировать также баги системы)
    Тогда нужно постоянно следить за обновлениями в коде системы — баги могут когда-то и пофиксить.
  • 0CodErr
    Выделение кнопки скошено на углах http://prntscr.com/j6jawa по 1 пикселю.
    В оригинале там прямоугольник.
    Из хаоса в космос
  • Обнови плиз иконку. Там в 16х16 правый верхний угол был не прозрачным http://prntscr.com/j6jla4
    Ну и битность понизил до 256 цветов, иконка стала чуть легче.
    Attachments
    skin.zip (1.19 KiB)
    Downloaded 299 times
    Из хаоса в космос
  • Leency wrote:Обнови плиз иконку.
    Обновил
    sknview.7z (37.95 KiB)
    Downloaded 292 times
    Leency wrote:иконка стала чуть легче
    Не так уж и принципиально по сравнению с размером программы :) Там, кстати, в этом файле не 1 иконка, а целых 3
    Spoiler:
    2.PNG
    2.PNG (3.8 KiB)
    Viewed 11098 times
    Одна иконка 16x16 весила бы чуть больше 1 Kb.
  • Leency wrote:Мне кажется заголовок на пару пикселей выше чем в системе. Я сужу по win 3.11. Или мне кажется?
    Кстати, внезапно, http://websvn.kolibrios.org/filedetails ... asm#line-5

    Code: Select all

      margins         = [5:1:44:1],\                            ; margins [left:top:right:bottom]
    Ядерная формула, видимо пытается как-то разрешить такую ситуацию, но, имхо, проблема всё же в скине.
  • Хотя, если bottom — количество пикселей от нижнего края заголовка(а не от верхнего), то похоже мне просто нужно было учитывать bottom при расчёте, а я учитывал только Top. Тогда в ядре, наверное, правильно сделано.
  • Теперь верхняя координата считается вот так:

    Code: Select all

    CaptionTop := (LongInt(Skin.Height) - Skin.Margins.Bottom - Skin.Margins.Top) Div 2 + Skin.Margins.Top - 8;
    sknview.7z (38.01 KiB)
    Downloaded 310 times
  • В skninfo и sknview есть такие строки:

    Code: Select all

      Windows.HeapFree(GetProcessHeap, 0, PFileBuffer);
      PFileBuffer := Windows.HeapAlloc(GetProcessHeap, 0, PPackedFile(PFileBuffer)^.UnpackedSize);
    сначала освобождается PFileBuffer, а затем происходит чтение оттуда UnpackedSize. И как оно ещё работает :)
    Хмм.. судя по https://docs.microsoft.com/en-us/window ... i-heapfree
    You should not refer in any way to memory that has been freed by HeapFree.
    After that memory is freed, any information that may have been in it is gone forever.
    If you require information, do not free memory containing the information.
    Читать оттуда не запрещается, но информация там уже будет не актуальная.
    Проверил, что прочитанное из PPackedFile(PFileBuffer)^.UnpackedSize значение(более 1 мегабайта) вполне достаточное для работы программы.
    Файлы скинов не настолько большие(менее 10 килобайтов), потому и работает.
    Но, конечно, всё равно это нужно исправить.
  • Who is online

    Users browsing this forum: No registered users and 0 guests