Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пт окт 20, 2017 2:50 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 43 сообщения ]  На страницу Пред. 1 2 3 След.
Автор Сообщение
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 1:16 am 
Не в сети

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


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 1:48 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 439
Veliant, можешь добавить в 615 строку код, выводящий на доску отладки menu->parent_wnd? Всё таки IPC - штука более затратная, чем кнопки. Не хотелось бы.
Спойлер: Показать
Код:
    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));
   }
   


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


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 3:33 am 
Не в сети
Аватара пользователя

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

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

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


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 12:57 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4219
Неплохо бы увеличить расстояния между пунктами меню

Изображение

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


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 1:05 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4219
GerdtR
Закомиттил rev 5672.
Код:
   cmp   ecx, 2                    ;эту и следующую строку убрать
   jb   .nowindowactivate

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


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 3:20 pm 
Не в сети
Аватара пользователя

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

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


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 10:12 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1187
А может сделать icon частью рабочего стола?


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт авг 04, 2015 10:39 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1076
Pathoswithin писал(а):
А может сделать icon частью рабочего стола?

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

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вт сен 01, 2015 11:20 am 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
Исправления выложу позже с новыми фишками, а пока хидер для c--

И пример использования
Спойлер: Показать
Код:
#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:


Вложения:
kmenu.h [3.05 КБ]
21 скачивание
Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Чт сен 03, 2015 12:05 pm 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
Обновилась до версии 1.2.

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


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


Вложения:
kmenu.h [3 КБ]
18 скачиваний
kmenu.obj [9.16 КБ]
12 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Чт сен 03, 2015 12:31 pm 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
Заголовочный файл C-- для новой версии


Вложения:
kmenu.h [3.48 КБ]
22 скачивания
Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Вс окт 11, 2015 9:02 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1187
Поизучал Textedit, пункты меню не всегда срабатывают. В частности, если открыть одно меню, а потом перевести курсор на соседнее и выбрать пункт оттуда.


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Ср окт 28, 2015 3:53 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пт апр 17, 2015 9:44 am
Сообщения: 29
Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Ср окт 28, 2015 4:49 pm 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
XProger писал(а):
Посмотрел TextEdit, нормально то что при открытии пункта меню перерисовывается весь рабочий стол?

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


Вернуться к началу
 Заголовок сообщения: Re: libkmenu
СообщениеДобавлено: Ср окт 28, 2015 9:17 pm 
Не в сети
Аватара пользователя

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

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 43 сообщения ]  На страницу Пред. 1 2 3 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB