DarekM wrote:

Hi
I'm proud to anons: Lazarus  under GTK2 don't crash

In patch:
conversion TFont to tLogFont in RetrieveLogFontForComparison
crash when empty in  Gtk2_ItemSelectionChanged
bug in extTextOut - maybe not all changes I have put to patch,

Darek
Index: components/synedit/syntextdrawer.pp
===================================================================
--- components/synedit/syntextdrawer.pp (wersja 9401)
+++ components/synedit/syntextdrawer.pp (kopia robocza)
@@ -555,17 +555,48 @@
 
 procedure TheFontsInfoManager.RetrieveLogFontForComparison(ABaseFont: TFont;
   var LF: TLogFont);
-var
-  pEnd: PChar;
+
+  procedure SetLogFontName(const NewName: string);
+  var l: integer;
+    aName: string;
+  begin
+    if IsFontNameXLogicalFontDesc(NewName) then
+      aName:=ExtractFamilyFromXLFDName(NewName)
+    else
+      aName:=NewName;
+    l:=High(LF.lfFaceName)-Low(LF.lfFaceName);
+    if l>length(aName) then l:=length(aName);
+    if l>0 then
+      Move(aName[1],LF.lfFaceName[Low(LF.lfFaceName)],l);
+    LF.lfFaceName[Low(LF.lfFaceName)+l]:=#0;
+  end;
+
+  
 begin
-  GetObject(ABaseFont.Handle, SizeOf(TLogFont), @LF);
   with LF do
   begin
+    FillChar(LF,SizeOf(LF),0);
+    lfHeight := ABaseFont.Height;
+    lfWidth := 0;
+    lfEscapement := 0;
+    lfOrientation := 0;
+
+    if fsBold in ABaseFont.Style then lfWeight:=FW_BOLD
+                                 else lfWeight:=FW_NORMAL;
+    lfCharSet := Byte(ABaseFont.Charset);
+    SetLogFontName(aBaseFont.Name);
+    lfQuality := DEFAULT_QUALITY;
+    lfOutPrecision := OUT_DEFAULT_PRECIS;
+    lfClipPrecision := CLIP_DEFAULT_PRECIS;
+    case ABaseFont.Pitch of
+      fpVariable: lfPitchAndFamily := VARIABLE_PITCH;
+      fpFixed: lfPitchAndFamily := FIXED_PITCH;
+    else
+      lfPitchAndFamily := DEFAULT_PITCH;
+    end;
     lfItalic := 0;
     lfUnderline := 0;
     lfStrikeOut := 0;
-    pEnd := StrEnd(lfFaceName);
-    FillChar(pEnd[1], @lfFaceName[High(lfFaceName)] - Pointer(pEnd), 0);
   end;
 end;
 

Index: lcl/interfaces/gtk2/gtk2winapi.inc
===================================================================
--- lcl/interfaces/gtk2/gtk2winapi.inc  (wersja 9406)
+++ lcl/interfaces/gtk2/gtk2winapi.inc  (kopia robocza)
@@ -82,7 +82,7 @@
         Exit;
       end;
       
-      if CompareText(lfFacename,'default')=0 then begin
+      if  (lfHeight=0) and (CompareText(lfFacename,'default')=0) then begin
         LoadDefaultFont;
         Result := HFONT(GdiObject);
         exit;
@@ -112,8 +112,8 @@
       else
         FullString:=IntToStr(aSize);
       FullString := AFamily + ' ' + aStyle + ' ' + FullString;
-      
 
+
       GdiObject^.GDIFontObject :=
         pango_font_description_from_string(PChar(FullString));
 
@@ -131,10 +131,10 @@
         // which would be great with the given lfheight value, but older gtk2 
version
         // doesn't have this funtion
         if lfHeight<0 then
-          aSize:= (abs(lfheight) * 72) div ScreenInfo.PixelsPerInchX
+          aSize:= (abs(lfheight) * 72 * PANGO_SCALE) div 
ScreenInfo.PixelsPerInchX
         else
-          aSize:=lfHeight;
-        pango_font_description_set_size( GdiObject^.GDIFontObject, 
aSize*PANGO_SCALE);
+          aSize:=lfHeight*PANGO_SCALE;
+        pango_font_description_set_size( GdiObject^.GDIFontObject, aSize);
       end;
 
 
@@ -219,7 +219,7 @@
       aRect := Classes.Rect(0,0,0,0);
       pango_layout_get_pixel_size(Layout, @arect.Right, @arect.Bottom);
 
-      OffsetRect(aRect, X+DCOrigin.X,Y+DCOrigin.Y);
+      OffsetRect(aRect, X,Y);
 
       gdk_draw_layout_with_colors(drawable, gc, aRect.Left, aRect.Top, Layout, 
Foreground, nil);
     end;
@@ -307,7 +307,7 @@
           UpdateDCTextMetric(TDeviceContext(DC));
           TxtPt.X := X + DCOrigin.X;
           LineHeight := DCTextMetric.TextMetric.tmHeight;
-          TxtPt.Y := TopY + LineHeight + DCOrigin.Y;
+          TxtPt.Y := TopY  + DCOrigin.Y;
 
           SelectedColors := dcscCustom;
 
@@ -499,11 +499,10 @@
   Count: Integer) : Boolean;
 var
   DCOrigin: TPoint;
-  aRect : TRect;
-
   UnRef,
   Underline,
   StrikeOut : Boolean;
+  yOffset   : integer;
 
   Layout : PPangoLayout;
   UseFontDesc : PPangoFontDescription;
@@ -537,6 +536,9 @@
         DebugLn('WARNING: [TGtk2WidgetSet.TextOut] Missing Font')
       else begin
         DCOrigin:=GetDCOffset(TDeviceContext(DC));
+        with DCTextMetric.TextMetric do
+          yOffset:= tmHeight-tmDescent-tmAscent;
+        if yOffset<0 then yOffset:=0;
         GetStyle(lgsdefault);
         Layout := gtk_widget_create_pango_layout (GetStyleWidget(lgsdefault), 
nil);
         pango_layout_set_font_description(Layout, UseFontDesc);
@@ -571,15 +573,9 @@
         //cross-compatibility with GTK1.2 and win32 interfaces.....
 
         pango_layout_set_text(Layout, Str, Count);
-
-        aRect := Rect(0,0,0, 0);
-        pango_layout_get_pixel_size(Layout, @arect.Right, @arect.Bottom);
-
-        OffsetRect(aRect, X+DCOrigin.X,Y+DCOrigin.Y);
-
         EnsureGCColor(DC, dccCurrentTextColor, True, False);
 
-        gdk_draw_layout_with_colors(drawable, GC, aRect.Left, aRect.Top, 
Layout, nil, nil);
+        gdk_draw_layout_with_colors(drawable, GC, X+DCOrigin.X, 
Y+DCOrigin.Y+yOffset, Layout, nil, nil);
         g_object_unref(Layout);
         Result := True;
         If UnRef then
Index: lcl/interfaces/gtk2/gtk2object.inc
===================================================================
--- lcl/interfaces/gtk2/gtk2object.inc  (wersja 9406)
+++ lcl/interfaces/gtk2/gtk2object.inc  (kopia robocza)
@@ -1,3 +1,4 @@
+{%MainUnit gtk2int.pp}
 {******************************************************************************
                                    TGtk2WidgetSet
  ******************************************************************************
Index: lcl/interfaces/gtk2/gtk2wscustomlistview.inc
===================================================================
--- lcl/interfaces/gtk2/gtk2wscustomlistview.inc        (wersja 9406)
+++ lcl/interfaces/gtk2/gtk2wscustomlistview.inc        (kopia robocza)
@@ -142,6 +142,10 @@
   //DebugLn('Gtk2_ItemSelectionChanged');
   Widgets := PTVWidgets(WidgetInfo^.UserData);
   msg.Msg := CN_NOTIFY;
+  if (widgets=nil) or (Widgets^.ItemCache=nil) or (Widgets^.ItemCache.Count=0) 
then begin
+    debugln(' Gtk2_ItemSelectionChanged  ItemChache=nil 
',tComponent(widgetInfo^.lclObject).name);
+    exit;
+  end;
   for i := 0 to Widgets^.ItemCache.Count -1 do begin
 
     FillChar(NM, SizeOf(NM), 0);

Reply via email to