Running lazarus under wine
Autor: Isaac Trindade | Publicado: 2009-08-17T17:23:00-07:00

Running lazarus under wineFor that they develop for linux and windows and the use of one virtual machine is not an alternative practises, and it has time to try wine, then this tip can be interesting.Really run an application in wine can not be the option most trustworthy, but in many cases decided the problem to have that to work simultaneously with two OS, what implies the use of virtual machines, that they consume much processing of cpu, but each one has an opinion and depends on each case.Make lazarus run on wineMany times when I installed lazarus in wine, he was not possible to work, therefore he did not obtain to open the projects.Example:project g:\diversos\laztestewin32\linux\rlreportteste.lpiWhen trying to open, lazarus returns that the project does not exist:E thus occurs pra any archive that to try to open.The first solution that came me the mind was to create one link symbolic pointing pra required folder, thus:Considering:G: =/home/testecd /home/teste/diversos/laztestewin32/ln - s linux/linu… and ready, it decided.The problem is that when opening the same archive, lazarus suppressed finishes it letter another time, and thus successively, and had that to create new link.I decided for the hand in the mass and to study the code.Then I created following the functions:Please, sees the unit mainwine.pas below listedI observed that the problem happens whenever the class TOpenDialog and TSaveDialog is used.Unit that this the code to save the projects, packages, etc is main.pp.Then,  is alone to include this unit (mainwine) in the uses  clause of unit main.pp and to call these functions before opening and saving its archives in IDE.It creates a directive USEWINE:{$DEFINE USEWINE}Now it implements in the cases below:procedure TMainIDE.mnuOpenClicked(Sender: TObject);...For I := 0 to OpenDialog.Files.Count-1 doBeginAFilename:=CleanAndExpandFilename(OpenDialog.Files.Strings[i]);       {$IFDEF USEWINE}       AFilename:=mainwine.WineValidFile(AFilename);       {$ENDIF}...    function TMainIDE.DoShowSaveFileAsDialog(AnUnitInfo: TUnitInfo;var ResourceCode: TCodeBuffer): TModalResult;... NewFilename:=ExpandFileNameUTF8(SaveDialog.Filename); {$IFDEF USEWINE} NewFilename:=WineValidSaveFile(NewFilename); {$ENDIF}...if ExtractFileExt(NewFilename)='' then begin NewFilename:=NewFilename+SaveAsFileExt; {$IFDEF USEWINE} NewFilename:=WineValidSaveFile(NewFilename); {$ENDIF}end;...{$IFDEF USEWINE}NewFilename:=WineValidSaveFile(NewFilename);{$ENDIF}NewFilePath:=ExtractFilePath(NewFilename);...function TMainIDE.DoShowSaveProjectAsDialog: TModalResult;...   NewFilename:=ExpandFileNameUTF8(SaveDialog.Filename);   {$IFDEF USEWINE}   NewFilename:=WineValidSaveFile(NewFilename);   {$ENDIF}   if not FilenameIsAbsolute(NewFilename) then     RaiseException('TMainIDE.DoShowSaveProjectAsDialog: buggy ExpandFileNameUTF8');   NewProgramName:=ExtractFileNameOnly(NewFilename);...I did not test all the cases, therefore for me of this skill he decided great part of the problem, and the code of IDE is very complex, and extensive.But a solution for the problem, and those developers is registered that collaborate with the project and have more affinity with the code of unit main.pp and others units that they make the IDE, can appreciate and it will be the case, to implement definitively, and thus to offer to end user a new alternative.Until the next one.unit mainwine; {$mode objfpc}{$H+}interfaceuses  Classes, SysUtils;   function WineValidFile(filename1:string):string;  function WineValidSaveFile(filename1:string):string;implementationfunction WineValidFile(filename1:string):string;varwineFile,wineFile2,winePath,winePath2:string;wineListChar:TStringlist;pathLen,charCount:integer;beginwineListChar:=TStringlist.Create;Result:=filename1;if not SysUtils.FileExists(filename1) thenbegin   WinePath:=SysUtils.ExtractFilePath(filename1);  PathLen:=length(WinePath);  WinePath:=copy(WinePath,1,PathLen-1);  wineFile:=SysUtils.ExtractFileName(filename1);   for charCount:=32 to 127 do begin     wineFile2:=WinePath+chr(charCount)+'\'+wineFile;     if fileexists(wineFile2) then begin       Result:=wineFile2;       break;     end;  end;end;end;function WineValidSaveFile(filename1:string):string;varwineFile,wineFile2,winePath,winePath2:string;wineListChar:TStringlist;pathLen,charCount:integer;beginwineListChar:=TStringlist.Create;Result:=filename1;if not SysUtils.FileExists(filename1) thenbegin  WinePath:=SysUtils.ExtractFilePath(filename1);  PathLen:=length(WinePath);  WinePath:=copy(WinePath,1,PathLen-1);  wineFile:=SysUtils.ExtractFileName(filename1);  for charCount:=32 to 127 do begin    wineFile2:=WinePath+chr(charCount)+'\'+wineFile;    if DirectoryExists(WinePath+chr(charCount)+'\') then  begin      Result:=wineFile2;           break;    end;  end;end;end;end.