
Download
video
grub.cfg (this code must be added before the menu items)
Code: Select all
search --no-floppy --fs-uuid --set=partfile UUID_где_файл
source (${partfile})/b/bootdefitem/defCode: Select all
;- TOP
EnableExplicit
Define UserIntLang
Define ForceLang
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
Define *Lang
If OpenLibrary(0, "kernel32.dll")
*Lang = GetFunction(0, "GetUserDefaultUILanguage")
If *Lang And CallFunctionFast(*Lang) = 1049 ; ru
UserIntLang = 1
EndIf
CloseLibrary(0)
EndIf
CompilerCase #PB_OS_Linux
If ExamineEnvironmentVariables()
While NextEnvironmentVariable()
If Left(EnvironmentVariableName(), 4) = "LANG" And Left(EnvironmentVariableValue(), 2) = "ru"
UserIntLang = 1
Break
EndIf
Wend
EndIf
CompilerEndSelect
#CountStrLang = 5
Global Dim Lng.s(#CountStrLang)
Lng(1) = "Reboot"
Lng(2) = "With a reboot"
Lng(3) = "Reboot?"
Lng(4) = "Reboot to "
Lng(5) = "The file does not exist, do you want to create it?"
;- # Constants
#Window = 0
#File = 0
Structure OS_List
name.s
id.i
EndStructure
;- ● Global
Global Path$, arg$, shutdown$
Global reboot = 1
Global confirmation, item$
Global ini$, PathConfig$
Global NewMap OS_List.OS_List()
Global id, id2, eg, Style, AlignsLeft
Global widthBtn = 200
Global heightBtn = 40
Declare ForceDirectories(Dir.s)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
Path$ = "/media/win11/b/bootdefitem/def"
arg$ = "-r"
shutdown$ = "shutdown"
CompilerElse
Path$ = "C:\b\bootdefitem\def"
arg$ = "-r -t 0"
shutdown$ = "shutdown.exe"
CompilerEndIf
;- ● ini
PathConfig$ = GetPathPart(ProgramFilename())
ini$ = PathConfig$ + "GrubDef.ini"
If OpenPreferences(ini$)
PreferenceGroup("set")
Path$ = ReadPreferenceString("path", Path$)
shutdown$ = ReadPreferenceString("shutdown", shutdown$)
arg$ = ReadPreferenceString("arg", arg$)
reboot = ReadPreferenceInteger("reboot", reboot)
confirmation = ReadPreferenceInteger("confirmation", confirmation)
ForceLang = ReadPreferenceInteger("forcelang", ForceLang)
widthBtn = ReadPreferenceInteger("widthBtn", widthBtn)
heightBtn = ReadPreferenceInteger("heightBtn", heightBtn)
AlignsLeft = ReadPreferenceInteger("AlignsLeft", AlignsLeft)
PreferenceGroup("item")
ExaminePreferenceKeys()
While NextPreferenceKey()
If Not FindMapElement(OS_List(), PreferenceKeyName())
If AddMapElement(OS_List(), PreferenceKeyName(), #PB_Map_NoElementCheck)
OS_List()\name = PreferenceKeyValue()
EndIf
EndIf
Wend
ClosePreferences()
Else
MessageRequester("ini", "GrubDef.ini not found")
EndIf
; Здесь нужно прочитать флаг из ini-файла определяющий принудительный язык, где
; 0 - автоматически
; -1 - принудительно первый
; 1 - принудительно второй
; Тем самым будучи в России можно выбрать англ язык или будучи в союзных республиках выбрать русский язык
If ForceLang = 1
UserIntLang = 0
ElseIf ForceLang = 2
UserIntLang = 1
EndIf
Procedure SetLangTxt(PathLang$)
Protected file_id, Format, i, tmp$
file_id = ReadFile(#PB_Any, PathLang$)
If file_id ; Если удалось открыть дескриптор файла, то
Format = ReadStringFormat(file_id) ; перемещаем указатель после метки BOM
i=0
While Eof(file_id) = 0 ; Цикл, пока не будет достигнут конец файла. (Eof = 'Конец файла')
tmp$ = ReadString(file_id, Format) ; читаем строку
tmp$ = RTrim(tmp$ , #CR$) ; коррекция если в Windows
If Asc(tmp$) And Asc(tmp$) <> ';'
i+1
If i > #CountStrLang ; массив Lng() уже задан, но если строк больше нужного, то не разрешаем лишнее
Break
EndIf
; Lng(i) = ReplaceString(tmp$, "\n", #LF$)
Lng(i) = tmp$
Else
Continue
EndIf
Wend
CloseFile(file_id)
EndIf
; Else
; SaveFile_Buff(PathLang$, ?LangFile, ?LangFileend - ?LangFile)
EndProcedure
; Если языковой файл существует, то использует его
If FileSize(PathConfig$ + "Lang.txt") > 10
UserIntLang = 0
SetLangTxt(PathConfig$ + "Lang.txt")
EndIf
If UserIntLang = 1
Lng(1) = "Перезагрузка"
Lng(2) = "С перезагрузкой"
Lng(3) = "Перезагрузка?"
Lng(4) = "Перезагрузка в "
Lng(5) = "Файл не существует, хотите его создать?"
EndIf
If FileSize(Path$) = -1 And MessageRequester("", Path$ + #LF$ + #LF$ + Lng(5), #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
If ForceDirectories(Path$)
If CreateFile(#File, Path$, #PB_Ascii)
WriteString(#File, "set default=" + Chr(34) + "0" + Chr(34), #PB_Ascii)
CloseFile(#File)
EndIf
EndIf
EndIf
If OpenPreferences(Path$)
item$ = ReplaceString(ReadPreferenceString("set default", "-1"), Chr(34), "")
; curitem = Val(ReplaceString(ReadPreferenceString("set default", "-1"), Chr(34), ""))
ClosePreferences()
EndIf
;-┌──GUI──┐
If OpenWindow(#Window, 0, 0, widthBtn + 20, MapSize(OS_List()) * heightBtn + 50, Lng(1) + " (" + item$ + ")", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If AlignsLeft
Style | #PB_Button_Left
EndIf
ForEach OS_List()
ButtonGadget(id, 10, id * heightBtn + 10, widthBtn, heightBtn - 3, MapKey(OS_List()) + " " + OS_List()\name, Style)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
If MapKey(OS_List()) = item$
SetGadgetState(id, #PB_Button_Default)
EndIf
CompilerEndIf
OS_List()\id = id
id + 1
Next
CheckBoxGadget(id , 10, id * heightBtn + 10, widthBtn, 30, Lng(2))
SetGadgetState(id, reboot)
id2 = id - 1
;-┌──Loop──┐
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
eg = EventGadget()
Select eg
Case 0 To id2
; Ищем по id
ForEach OS_List()
If OS_List()\id = eg
; Debug OS_List()\name
Break
EndIf
Next
If CreateFile(#File, Path$, #PB_Ascii)
WriteString(#File, "set default=" + Chr(34) + MapKey(OS_List()) + Chr(34), #PB_Ascii)
CloseFile(#File)
EndIf
If GetGadgetState(id) & #PB_Checkbox_Checked
If confirmation And MessageRequester(Lng(3), Lng(4) + OS_List()\name + "?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_No
Continue
EndIf
RunProgram(shutdown$, arg$, "")
EndIf
CloseWindow(#Window)
End
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(#Window)
End
EndSelect
ForEver
EndIf
;==================================================================
;
; Author: ts-soft
; Date: March 5th, 2010
; Explain:
; modified version from IBSoftware (CodeArchiv)
; on vista and above check the Request for "User mode" or "Administrator mode" in compileroptions
; (no virtualisation!)
;==================================================================
Procedure ForceDirectories(Dir.s)
Static tmpDir.s, Init
Protected result
If Len(Dir) = 0
ProcedureReturn #False
Else
If Not Init
tmpDir = Dir
Init = #True
EndIf
If (Right(Dir, 1) = #PS$)
Dir = Left(Dir, Len(Dir) - 1)
EndIf
If (Len(Dir) < 3) Or FileSize(Dir) = -2 Or GetPathPart(Dir) = Dir
If FileSize(tmpDir) = -2
result = #True
EndIf
tmpDir = ""
Init = #False
ProcedureReturn result
EndIf
ForceDirectories(GetPathPart(Dir))
ProcedureReturn CreateDirectory(Dir)
EndIf
EndProcedureCode: Select all
[set]
widthBtn = 200
heightBtn = 40
AlignsLeft = 0
path = C:\b\bootdefitem\def
shutdown = shutdown.exe
arg = -r -t 0
reboot = 0
confirmation = 0
forcelang = 0
[item]
0 = Mint
1 = CachyOS
2 = Windows11
3 = FedoraCode: Select all
[set]
widthBtn = 200
heightBtn = 40
AlignsLeft = 0
path = /media/win11/b/bootdefitem/def
shutdown = shutdown
arg = -r now
reboot = 0
confirmation = 0
forcelang = 0
[item]
0 = Mint
1 = CachyOS
2 = Windows11
3 = Fedora
