Перейти к содержимому
RccHD

Разработка новой операционной системы. WinOS.

Рекомендуемые сообщения

Ты хочешь строго разделять - кто пользуется конкретным компонентом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты хочешь строго разделять - кто пользуется конкретным компонентом?

Не обязательно. Главное, чтобы была возможность разрешения коллизий и распределения компонент между окнами

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ААААААААААААААААААААААААААААААААААААААА!!!!!!!!!!
Как же оказывается сложно писать свою ОС  :unsure: 
Очень много приходится проектировать.

80% времени проектирую, 20% времени пишу код

  • Ха-ха 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нужно написать функции getComponent и freeComponent, которые будут разрешать коллизии компонент. ( когда два окна требуют одну и ту же компоненту ) Функции должны распределять компоненты одинакового типа между окнами. Например если есть 2 редстоун-адаптера и 2 окна потребовали компонент "redstone", то каждое окно должно получить свой редстоун-адаптер

Тут еще можно подумать о виртуальных компонентах, т.к. некоторые приложения не нуждаются в монопольном доступе к компонентам. Например, два сетевых приложения могут разделять сетевой адаптер, задействуя только нужные им порты. Другие приложения могут использовать лишь одну сторону красной платы.
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Нужно написать функции getComponent и freeComponent, которые будут разрешать коллизии компонент. ( когда два окна требуют одну и ту же компоненту )
Эти функции  будут вызываться приложением или системой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Эти функции  будут вызываться приложением или системой?

Хороший вопрос

 

Их будет вызывать специальный распределитель компонент, т.е. система

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что помешает приложению вызвать component.proxy() для доступа к компоненту в обход системы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тут еще можно подумать о виртуальных компонентах, т.к. некоторые приложения не нуждаются в монопольном доступе к компонентам.

 

...

Да, нужно разделять компоненты на 3 типа.

 

1) компонент, к которому нельзя получить прямой доступ ( только gpu ). Вместо gpu надо вернуть gpuProxy(уже реализован)

2) компонент, который можно поделить между несколькими приложениями

3) компонент, который не может быть использован сразу несколькими приложениями

Изменено пользователем RccHD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@@Zer0Galaxy

Я заменяю component.proxy, component.invoke, component.setPrimary, component.getPrimary, component.list

Изменено пользователем RccHD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Нужно написать функции getComponent и freeComponent, которые будут разрешать коллизии компонент. ( когда два окна требуют одну и ту же компоненту ) Функции должны распределять компоненты одинакового типа между окнами. Например если есть 2 редстоун-адаптера и 2 окна потребовали компонент "redstone", то каждое окно должно получить свой редстоун-адаптер  
local components={} -- тут будем хранить занятые компоненты
local getComponent = function(window, componentType, componentAddress)
    --[[
window - это окно, которое потребовало компоненту
componentType - тип компоненты ( игнорировать GPU )
componentAddress - адрес требуемой компоненты (этот параметр, на мой взгляд, не нужен)
    ]]
	
	for address in component.list(componentType) do -- здесь и далее вызываем родные функции component, а не подмену
	
      if components[address]==nil then -- если компонент не занят, занимаем его
	    components[address]=window
	  end
	  
	  if components[address]==window then -- если компонент занят этим окном,
	    return component.proxy(address)  -- возвращаем его прокси
	  end
	  
	end
    -- вернем nil, если свободных компонент не найдено
end
 
local freeComponent = function(componentAddress)
    -- пометить компонент <componentAddress> как незанятый
	components[componentAddress]=nil
end 

как то так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

как то так?

Ну вроде должно работать правильно. Я пока не могу это с компа запустить и потестить

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Например, два сетевых приложения могут разделять сетевой адаптер, задействуя только нужные им порты.

 

Кстати, не всегда такой фокус покатит. Порты ведь открываются на весь компонент.

И не все приложения проверяют - с их порта пришло сообщение, или с чужого. Предполагается ведь, что твоя прога в конкретный момент времени - единоличный обладатель модема =)

 

Кстати, как там с поглощением эвентов?

Два моих приложения висят на модеме, и слушают эвенты. Приложение А поймало modem_message. Поймает ли этот же мессадж приложение Б?

Или оно окажется поглощено приложением А?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Кстати, как там с поглощением эвентов?

Два моих приложения висят на модеме, и слушают эвенты. Приложение А поймало modem_message. Поймает ли этот же мессадж приложение Б?

Или оно окажется поглощено приложением А?

Не знаю, приду домой -- проверю.

 

Вообще вроде бы все приложения уловят ивент(вспомни пример, когда я управлял сразу двумя змейками)

 

Если это работает для key_down, то и для модема сработает, я думаю

  • Нравится 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Наконец-то смог запустить TTY в виртуальном окружении!

vokoscreen-2017-09-10_01-46-44.gif


Теперь можно сделать полноценные терминалы ( скопировать исходники из OpenOS )

  • Нравится 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно как-нибудь пощупать, тот wm что ты сделал?
Пожелания по тому, что я увидел на скриншотах из поста.

  1. Можешь сделать возможность изменять ширину рамки окна? Например у тебя сейчас у тебя 2 пикселя хотелось бы сделать 1 или вообще убрать
  2. Можешь сделать workspaces и разных пользователей (linux: ctrl + alt + Fi)?
  3. Можешь сделать язык раскладки компьютера независимым от реальной раскладки?
  4. Можешь сделать настраиваемую панель инструментов? Чтобы пользователь сам мог туда поместить номер воркспейса, язык, майн-время, реальное время, кол-во занятой/свободной оперативки и тп.
  5. Можешь сделать шапки окошкам и дать возможность окошкам стакаться, разными способами?
  6. Можешь поддерживать горячие клавиши из i3 и дать возможность создать свои?
  7. Можешь сделать возможность поставить заставку, фон рабочего стола? Так же дать возможность разработчику приложения сделать полупрозрачные окна?
  8. Можешь сделать консоль с настраиваемым шрифтом и фоном?
  9. Можешь сделать полноценную однострочную консоль запускаемую используя горячую клавишу? По типу той что запускается в i3 на 'mode' + D (только в i3 это не консоль, но ты сделай консоль =))
  10. Можешь сделать возможность изменения размеров окна мышкой, а так же дать возможность программисту делать перетаскиваемые окна. Например отчёт об ошибке или предупреждение так лучше выглядит. (окошечко с одной кнопкой ОК)

А у тебя поддерживаются несколько мониторов?

 

псы, ты точно пишешь ОС?

Изменено пользователем Seryoga

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

...

1) Сейчас рамка в 1 пиксель, ее можно будет убрать, наверное

2) Боюсь, может не хватить 2мб оперативки на все это, но я попробую

3) нет такой возможности

4) будет в стандартной реализации оконного менеджера ( настройка через конфиг )

5) да, но на счет шапок не уверен... На маленьких экранах можно будет выключить шапку

6) будет в стандартной реализации оконного менеджера ( настройка через конфиг )

7) не уверен

8) наверное

9) наверное

10) перетаскивание не буду делать, т.к. у нас маленькие экраны и МАЛО оперативки.

 

Поддержки нескольких мониторов наверное не будет, т.к. для операций с gpu у меня используется двойная буфферизация и на несколько рабочих столов/экранов не хватит ОЗУ

 

псы, ты точно пишешь ОС?

Изначально я хотел написать оконный менеджер и все. Но как только я начал, стало понятно, что нужно делать еще виртуальную среду для каждого окна, кастомные обработчики событий, подмена _ENV, подмена require и loadfile, подмена event, component, component.gpu и много еще всего

То, что я делаю можно назвать "почти ОС" или "надстройка над OpenOS"

Изменено пользователем RccHD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Сейчас рамка в 1 пиксель, ее можно будет убрать, наверное


Я имел в виду, что у вас сейчас на разделение тратится 2 пикселя. А можно тратить 1, если сделать рамку общей для соседних окон. То есть сначала размечаем сетку. А затем отдаём ячейки программам на использование.

Если я не прав в первом утверждении, то не могли бы вы скинуть скриншот текущей версии wm?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я имел в виду, что у вас сейчас на разделение тратится 2 пикселя. А можно тратить 1, если сделать рамку общей для соседних окон

Однопиксельные рамки сделать не получится, потому что символ имеет высоту 2 "пикселя" (▀)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На мой взгляд, разрешение ОС-монитора не такое большое, чтобы делить его на окна.

Если бы я стал писать многозадачную операционку, разделение экрана я бы реализовал не как в Windows, а как в Androidе. Т.е. из всех запущенных приложение только одно захватывает экран, оно же обрабатывает события мыши и клавы. Остальные приложения крутятся в фоне и если что-то пишут, то на свой виртуальный экран.

Но, это лишь мое скромное мнение.

  • Нравится 6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...