Page 1 of 1

SysFn48.7:GetSkinMargins

Posted: Tue Oct 25, 2016 12:39 pm
by 0CodErr
Это может её нужно использовать для предотвращения проблем с текстом в заголовке окна?
http://websvn.kolibrios.org/filedetails ... #line-2315
Вот она что возвращает
Spoiler:Image
Исходник
Spoiler:

Code: Select all

Unit Unit1;
(* -------------------------------------------------------- *)
Interface
(* -------------------------------------------------------- *)
Type

  Dword = Cardinal;

  TRect = Packed Record
    Left:   Dword;
    Top:    Dword;
    Right:  Dword;
    Bottom: Dword;
  End;

Var
  hConsole: Pointer;
  ConsoleInit:       Procedure(WndWidth, WndHeight, ScrWidth, ScrHeight: Dword; Caption: PChar); StdCall;
  ConsoleExit:       Procedure(bCloseWindow: Cardinal); StdCall;
  printf:            Function(Const Format: PChar): Integer; CDecl VarArgs;
(* -------------------------------------------------------- *)
  Procedure Main; Forward;
  Procedure ThreadTerminate; Forward;
  Function  LoadLibrary(Path: PChar): Pointer; StdCall; Forward;
  Function  GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer; StdCall; Forward;
  Function  GetSkinMargins: TRect; Forward;
(* -------------------------------------------------------- *)
Implementation
(* -------------------------------------------------------- *)
Procedure Main();
Var
   SkinMargins: TRect;
Begin

   hConsole          := LoadLibrary('/sys/lib/console.obj');
   ConsoleInit       := GetProcAddress(hConsole, 'con_init');
   ConsoleExit       := GetProcAddress(hConsole, 'con_exit');
   printf            := GetProcAddress(hConsole, 'con_printf');

   ConsoleInit($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, 'Test');

   SkinMargins := GetSkinMargins();

   printf('SkinMargins.Left   = %d'#10, SkinMargins.Left);
   printf('SkinMargins.Right  = %d'#10, SkinMargins.Right);
   printf('SkinMargins.Top    = %d'#10, SkinMargins.Top);
   printf('SkinMargins.Bottom = %d'#10, SkinMargins.Bottom);

   ConsoleExit(0);
   ThreadTerminate;
End;
(* -------------------------------------------------------- *)
Function  GetSkinMargins: TRect;
Asm
        push   ebx
        push   edi
        mov    edi, eax
        mov    eax, 48
        mov    ebx, 7
        int    64
        movzx  edx, ax
        movzx  ecx, bx
        shr    eax, 16
        shr    ebx, 16
        mov    [edi].TRect.Left, eax
        mov    [edi].TRect.Right, edx
        mov    [edi].TRect.Top, ebx
        mov    [edi].TRect.Bottom, ecx
        pop    edi
        pop    ebx
End;
(* -------------------------------------------------------- *)
Procedure ThreadTerminate();
Asm
        mov    eax, $FFFFFFFF
        int    64
End;
(* -------------------------------------------------------- *)
Function GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer;
Asm
        push   esi
        push   edi
        push   ebx
        mov    edx, hLib
        xor    eax, eax
        test   edx, edx
        jz     @end
        mov    edi, ProcName
        mov    ecx, $FFFFFFFF
        repne scasb
        mov    ebx, ecx
        not    ebx
@next:
        mov    esi, [edx]
        test   esi, esi
        jz     @end
        mov    ecx, ebx
        mov    edi, ProcName
        add    edx, 8
        repe cmpsb
        jne    @next
        mov    eax, [edx - 4]
@end:
        pop    ebx
        pop    edi
        pop    esi
End;
(* -------------------------------------------------------- *)
Function LoadLibrary(Path: PChar): Pointer;
Asm
        push   ebx
        mov    eax, 68
        mov    ebx, 19
        mov    ecx, Path
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
End.
Я, например, никогда не использовал её, а использовал только SysFn48.4:GetSkinHeight http://websvn.kolibrios.org/filedetails ... #line-2240

Re: SysFn48.7:GetSkinMargins

Posted: Tue Oct 25, 2016 1:03 pm
by Pathoswithin
Я уже понял, что ошибка в текущем скине: SkinMargins.Right должен быть больше 43. Только где это редактировать?

Re: SysFn48.7:GetSkinMargins

Posted: Tue Oct 25, 2016 1:06 pm
by Leency
Я тоже никогда не знал о ней О_о
Возвращаемые значения странные (похоже неправильные причем все). Где они задаются?

Re: SysFn48.7:GetSkinMargins

Posted: Tue Oct 25, 2016 2:25 pm
by Pathoswithin
Ты ж менял скин, где ты его взял?

Re: SysFn48.7:GetSkinMargins

Posted: Tue Oct 25, 2016 3:25 pm
by CleverMouse
Leency wrote:Я тоже никогда не знал о ней О_о
Возвращаемые значения странные (похоже неправильные причем все). Где они задаются?
В параметре margins макроса SKIN_PARAMS из исходника скина. Неожиданно, правда?

Re: SysFn48.7:GetSkinMargins

Posted: Fri Oct 20, 2017 2:25 pm
by 0CodErr
#7102
Исправил SkinMargins.Right для текущего скина по умолчанию Shkvorka.
Теперь текст в заголовке не должен налезать на кнопки.

Re: SysFn48.7:GetSkinMargins

Posted: Sat Oct 21, 2017 1:24 am
by Leency
Ооо, вот это респект.

Re: SysFn48.7:GetSkinMargins

Posted: Sat Oct 21, 2017 1:49 am
by Pathoswithin
Действительно, кому-то стало не пофиг, редкий случай.

Re: SysFn48.7:GetSkinMargins

Posted: Sat Oct 21, 2017 6:10 am
by 0CodErr
Странно, что человек, который уже знал до этого, что нужно править, так и не поправил это.
Хотя это — секундное дело.

Re: SysFn48.7:GetSkinMargins

Posted: Sat Oct 21, 2017 2:35 pm
by Leency
Я не знал, что это в скине настраивается.