Board.KolibriOS.org

Official KolibriOS board
It is currently Sat May 25, 2019 12:16 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 14 posts ] 
Author Message
PostPosted: Sun Mar 23, 2014 10:07 am 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Вопрос, что лежит конкретно в [CURRENT_TASK]? Понимаю что это текущий процесс, но как устроен этот dd
Code:
OS_BASE             equ 0x80000000
window_data         equ (OS_BASE+0x0001000)
CURRENT_TASK        equ (OS_BASE+0x0003000)

window._.sys_set_window
Code:
        mov     eax, [CURRENT_TASK]               ; грузим значение текущего процесса
        shl     eax, 5                            ; зачем сдвиг при этом еще и на 5 ?
        add     eax, window_data                  ; прибавляем указатель на данные

Вероятно так мы добираемся до WDATA, но почему сдвиг на 5 и зачем. Где посмотреть, что пишется в CURRENT_TASK?


Top
   
PostPosted: Sun Mar 23, 2014 12:30 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
это номер слота активного потока.


Top
   
PostPosted: Sun Mar 23, 2014 12:42 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Serge wrote:
это номер слота активного потока.
это сам CURRENT_TASK
а сдвиг для чего?


Top
   
PostPosted: Sun Mar 23, 2014 1:53 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1328
в структуре window_data на каждый слот отводится 32 байта.
сдвиг влево на 5 - это фактически умножение номера слота на 32.

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков


Top
   
PostPosted: Sun Mar 23, 2014 2:11 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
art_zh wrote:
в структуре window_data на каждый слот отводится 32 байта.
сдвиг влево на 5 - это фактически умножение номера слота на 32.

art_zh, Serge спасибо, теперь дошло!


Top
   
PostPosted: Mon Mar 31, 2014 5:02 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???


Top
   
PostPosted: Mon Mar 31, 2014 5:27 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Akyltist wrote:
Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???

Сначала пересчитывается буфер перекрытия окон, а код перерисовки фона выводит тот участок, который надо восстановить. Всем процессам, окна которых попали хотя бы одним пикселем в активную зону отправляется событие перерисовки, которое обычно обрабатывает код главного цикла приложения.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Mon Mar 31, 2014 5:45 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Mario_r4 wrote:
Akyltist wrote:
Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???

Сначала пересчитывается буфер перекрытия окон, а код перерисовки фона выводит тот участок, который надо восстановить. Всем процессам, окна которых попали хотя бы одним пикселем в активную зону отправляется событие перерисовки, которое обычно обрабатывает код главного цикла приложения.

системный фон по тому же принципу?


Top
   
PostPosted: Mon Mar 31, 2014 6:13 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Akyltist wrote:
Mario_r4 wrote:
Akyltist wrote:
Я правильно понимаю, что при изменении положения окна, не происходит полной перерисовки буфера , начиная от фона и заканчивая верхним активным окном, а просто происходит перерисока того участка который подвергся изменению? Если так, то откуда окно берет данные, которые оно перекрывало, чтобы восстановить их? Из [_WinMapAddress] ???

Сначала пересчитывается буфер перекрытия окон, а код перерисовки фона выводит тот участок, который надо восстановить. Всем процессам, окна которых попали хотя бы одним пикселем в активную зону отправляется событие перерисовки, которое обычно обрабатывает код главного цикла приложения.

системный фон по тому же принципу?

Есть только одни фон - фон рабочего стола.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Mon Mar 31, 2014 6:27 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Mario_r4 wrote:
Есть только одни фон - фон рабочего стола.

который тоже перерисовывается полностью если его коснулись изменения?


Top
   
PostPosted: Mon Mar 31, 2014 9:07 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Akyltist wrote:
Mario_r4 wrote:
Есть только одни фон - фон рабочего стола.

который тоже перерисовывается полностью если его коснулись изменения?

Нет, я же написал:
Quote:
а код перерисовки фона выводит тот участок, который надо восстановить

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Mon Mar 31, 2014 9:49 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Mario_r4 спасибо!


Top
   
PostPosted: Sun May 25, 2014 2:38 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
Вопрос такой, можно ли срезать вот такой код:
Code:
align 4
;------------------------------------------------------------------------------
sys_button_activate_handler: ;/////////////////////////////////////////////////
;------------------------------------------------------------------------------
;? <description>
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------
        call    button._.find_button
        or      eax, eax
        jz      .exit

        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
        call    button._.negative_button

  .exit:
        ret

align 4
;------------------------------------------------------------------------------
sys_button_deactivate_handler: ;///////////////////////////////////////////////
;------------------------------------------------------------------------------
;? <description>
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------
        call    button._.find_button
        or      eax, eax
        jz      .exit

        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
        call    button._.negative_button

  .exit:
        ret

До:
Code:
align 4
;------------------------------------------------------------------------------
sys_button_activate_handler: ;/////////////////////////////////////////////////
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------

align 4 ; тоже вроде ни к чему
;------------------------------------------------------------------------------
sys_button_deactivate_handler: ;///////////////////////////////////////////////
;------------------------------------------------------------------------------
;? <description>
;------------------------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;------------------------------------------------------------------------------
        call    button._.find_button
        or      eax, eax
        jz      .exit

        mov     ebx, dword[eax + SYS_BUTTON.id_hi - 2]
        call    button._.negative_button

  .exit:
        ret

или не стоит?
PS: код из (root)/kernel/trunk/gui/button.inc


Top
   
PostPosted: Sun May 25, 2014 7:51 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Akyltist wrote:
или не стоит?
PS: код из (root)/kernel/trunk/gui/button.inc

Не стоит. Рекомендую самому подумать почему не стоит, раз уж возникла идея такой копеечной оптимизации.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 14 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited