Board.KolibriOS.org

Official KolibriOS board
It is currently Thu Apr 25, 2019 7:28 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 43 posts ]  Go to page Previous 1 2 3 Next
Author Message
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 1:16 am 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
С отрисовкой с краю экрана точно бага. Тк не совпадают координаты по которым запрашивается рисовать окно меню с фактическими.
По поводу первого скорей архитектурный баг и придется переводить на IPC. При вызове отрисовки меню оно сохраняет ид активного окна, и потом при клике делает его активным и отправляет сообщение. Полагаю проблема в том что неправильно с самого начала получает ид окна родительского


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 1:48 am 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Veliant, можешь добавить в 615 строку код, выводящий на доску отладки menu->parent_wnd? Всё таки IPC - штука более затратная, чем кнопки. Не хотелось бы.
Spoiler: Show
Code:
    kos_SetForegroundWindow(menu->parent_wnd);
   // send seleted menu id    <-- # вот сюда #
   if (menu->return_btnid != -1)
   {
      /*while (kos_GetForegroundWindow() != menu->parent_wnd)
         kos_Sleep(100);*/
      switch (menu->return_btnid)
      {
         case 1:
            if (menu->level == 0)
               break;
            kos_SendMessage(SYSEVENT_BTNPRESS, menu->return_btnid);
            kos_ThreadYield();
            break;
         default:
            kos_SendMessage(SYSEVENT_BTNPRESS, menu->return_btnid);
            kos_ThreadYield();
            break;
      }
      //kos_IPCSend(menu->parent_tid, &menu->return_btnid, sizeof(menu->return_btnid));
   }
   


_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 3:33 am 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Не надо ничего добавлять. Вызов mcall 18,3,1(сделать активном окно в слоте 1) действительно не работает. Все окна активируются, рабочий стол - нет. Варианта 2: либо правим ядро, либо информируем через IPC. Если ядро, то надо в файле kernel.asm строки 2316 и 2317 (r5668) убрать:
Code:
sysfn_activate:    ; 18.3 = ACTIVATE WINDOW
   cmp   ecx, 2                    ;эту и следующую строку убрать
   jb   .nowindowactivate
   cmp   ecx, [TASK_COUNT]
   ja   .nowindowactivate

Тогда окно слота 1 будет активироваться успешно. Я опробовал сей патч, всё работает как положено (бывают же чудеса :) ). Ну кто c svn работает, поправьте пожалуйста, если возражений нет(мне наново ставить тортоис, качать репизиторий... потом как-нибудь сделаю). Ну или у кого идеи получше.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 12:57 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4993
Неплохо бы увеличить расстояния между пунктами меню

Image

_________________
Через тернии к звездам


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 1:05 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4993
GerdtR
Закомиттил rev 5672.
Code:
   cmp   ecx, 2                    ;эту и следующую строку убрать
   jb   .nowindowactivate

_________________
Через тернии к звездам


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 3:20 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Увы, но помогло. И вот в чём дело: моя прога имеет TID больший 4. Рабочий стол принадлежит TID 1. Что ни сделай, а очередь сообщений для TID 1 icon не прочитает. А кнопки приходят в TID 1. Вариант решения такой: добавляем сисфункцию, которая сможет прочитать из чужой очереди сообщений(ну или только активного окна). Некий mcall 72,2. Это самое простое решение(мне так кажется). Можно уже наконец научить Колибри рисовать окна, которые "всегда позади" и уже оно сменит рабочий стол. Или добавить механизм хуков, перехватывать сообщения кнопок для TID 1 и пересылать их в icon. Короче.. идеи, предложения?
PS: или меню перевести на IPC. Интересно, сильно код для рядовых программ усложнится?

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 10:12 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1259
А может сделать icon частью рабочего стола?


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Aug 04, 2015 10:39 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
Pathoswithin wrote:
А может сделать icon частью рабочего стола?

icon это и есть рабочий стол

_________________
я лишь учусь


Top
   
 Post subject: Re: libkmenu
PostPosted: Tue Sep 01, 2015 11:20 am 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
Исправления выложу позже с новыми фишками, а пока хидер для c--

И пример использования
Spoiler: Show
Code:
#define MEMSIZE 0x10000
#include "..\lib\kolibri.h"
#include "..\lib\mem.h"
#include "..\lib\dll.h"
#include "..\lib\obj\kmenu.h"

dword GetSystemColors()
{
   dword buf = malloc(192);
   EAX = 48;
   EBX = 3;
   ECX = buf;
   EDX = 192;
   $int 0x40
   return buf;
}

dword main_menu;

void main() {
   int id, key;
   dword colors;
   dword sub_menu1;
   
   mem_Init();
   
   if (kmenu_load() != 0)
   {
      notify("Error while loading GUI library /sys/lib/kmenu.obj");
      ExitProcess();
   }
   
   colors = GetSystemColors();
   if (colors == 0)
   {
      notify("No enough memory for systemcolors struct");
      ExitProcess();
   }
   
   kmenu.init(colors);
   
   sub_menu1 = kmenu.subm.create();   
   kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_NORMAL, "Open", 101));   
   kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_NORMAL, "Save", 102));
   kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_SEPARATOR, 0, 0));   
   kmenu.subm.add(sub_menu1, kmenu.item.create(KMENUITEM_NORMAL, "Exit", 103));
   
   main_menu = kmenu.subm.create();
   kmenu.subm.add(main_menu, kmenu.item.create(KMENUITEM_SUBMENU, "File", sub_menu1));

   loop() {
      switch(WaitEvent()) {
         case evButton:
            id = GetButtonID();
            if (id == 1)
               break;

         case evKey:
            key = GetKey();

         case evReDraw:
            draw_window();
            break;
            
         case evMouse:
            kmenu.mainm.dispatch_cursorevent(main_menu);
            break;
      }
   }
   free(colors);
}


void draw_window() {
   DefineAndDrawWindow(215,100,500,200,0x34,0xeeeEEE,"Kmenu test");
   kmenu.mainm.draw(main_menu);
}


stop:


Attachments:
kmenu.h [3.05 KiB]
Downloaded 74 times
Top
   
 Post subject: Re: libkmenu
PostPosted: Thu Sep 03, 2015 12:05 pm 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
Обновилась до версии 1.2.

По большей части исправлено поведение выпадения вложенных меню возле краев экрана. Теперь выпадающие меню рисуются с свободной стороны от родительского меню.
Attachment:
Безымянный.png
Безымянный.png [ 13.52 KiB | Viewed 1901 times ]


Изменения в API:
  • параметр для kmenu_init стал необязательным -- используется стандартная палитра;
  • добавлена функция kmenu_set_font, позволяющая задавать шрифт во всех создаваемых меню;
    Attachment:
    Безымянный.png
    Безымянный.png [ 6.21 KiB | Viewed 1901 times ]
  • добавлена функция kmainmenu_get_height, позволяющая узнать высоту основного меню для корректной отрисовки остальных элементов интерфейса;
  • добавлены функции ksubmenu_set_items_padding и ksubmenu_set_items_margin позволяющие задавать внешние и внутренние отступы элементов конкретного меню. Неизменяемые значения необходимо установить в -1.


Attachments:
kmenu.h [3 KiB]
Downloaded 69 times
kmenu.obj [9.16 KiB]
Downloaded 64 times
Top
   
 Post subject: Re: libkmenu
PostPosted: Thu Sep 03, 2015 12:31 pm 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
Заголовочный файл C-- для новой версии


Attachments:
kmenu.h [3.48 KiB]
Downloaded 71 times
Top
   
 Post subject: Re: libkmenu
PostPosted: Sun Oct 11, 2015 9:02 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1259
Поизучал Textedit, пункты меню не всегда срабатывают. В частности, если открыть одно меню, а потом перевести курсор на соседнее и выбрать пункт оттуда.


Top
   
 Post subject: Re: libkmenu
PostPosted: Wed Oct 28, 2015 3:53 pm 
Offline
User avatar

Joined: Fri Apr 17, 2015 9:44 am
Posts: 28
Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?


Top
   
 Post subject: Re: libkmenu
PostPosted: Wed Oct 28, 2015 4:49 pm 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
XProger wrote:
Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?

Это связано с тем, что окно меню перекрывает родительское окно и система начинает снова перерисовывать все окна лежащие под окном меню. Увы, рисование меню без нового окна приведет к еще большим графическим артефактам


Top
   
 Post subject: Re: libkmenu
PostPosted: Wed Oct 28, 2015 9:17 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
XProger, весь рабочий стол? Или окна, которые под меню? Рабочий стол должен перерисовываться только там, где его перекрывало меню.
PS: Надо ещё добавить в ядро дочерние окна как-то, чтоб в панели не показывались.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 43 posts ]  Go to page Previous 1 2 3 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


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