diff --git a/lcl/interfaces/gtk/gtkcallback.inc b/lcl/interfaces/gtk/gtkcallback.inc index 5eaef0ad30..a830f72cdd 100644 --- a/lcl/interfaces/gtk/gtkcallback.inc +++ b/lcl/interfaces/gtk/gtkcallback.inc @@ -2422,199 +2422,204 @@ begin DeliverMessage(Data, MessI); end; -{$IFNDEF GTK2} +{$IFDEF gtk1} function gtk_range_get_update_policy(range: PGTKRange): TGtkUpdateType; begin result := policy(Range^) end; {$ENDIF} -{$IFDEF VerboseGtkScrollbars} -procedure DebugScrollEvent(Range: PgtkRange); +function get_gtk_scroll_type(range: PGTKRange): TGtkScrollType; +{$IFNDEF gtk1} +type + TUnOpaqueTimer=record + timeout_id: guint; + ScrollType: TGTkScrollType; + end; + PUnOpaqueTimer=^TUnopaqueTimer; +{$ENDIF} +begin +{$IFDEF gtk1} + Result :=Scroll_type(Range^); +{$ELSE} + if (gtk_major_version=2) and (gtk_minor_version<6) and + (Range^.Timer<>nil) then + {$warning gtk2 pre gtk2.6 ONLY, tested gtk2.0} + Result := PUnOpaqueTimer(Range^.Timer)^.ScrollType + else + Result := GTK_SCROLL_NONE; +{$ENDIF} +end; + +{$IFDEF VerboseGtkScrollbars} +procedure DebugScrollStyle(Scroll: LongInt); begin - DbgOut('BUTTON='); - case Range^.Button of - 1: DbgOut('LEFT '); - 2: DbgOut('CENTER '); - 3: DbgOut('RIGHT '); - else DbgOut(IntToStr(Range^.Button), ' -> ? '); - end; - DbgOut('CLICK_CHILD='); - case click_child(Range^) of - 1: DbgOut('TROUGH '); - 2: DbgOut('SLIDER '); - 3: DbgOut('STEP_FORW '); - 4: DbgOut('STEP_BACK '); - else DbgOut(IntToStr(click_child(range^)), ' -> ? '); - end; - DbgOut('IN_CHILD='); - case in_child(range^) of - 1: DbgOut('TROUGH '); - 2: DbgOut('SLIDER '); - 3: DbgOut('STEP_FORW '); - 4: DbgOut('STEP_BACK '); - else DbgOut(IntToStr(in_child(Range^)), ' -> ? '); - end; DbgOut('TYPE='); - case Scroll_Type(Range^) of + case Scroll of GTK_SCROLL_NONE: DbgOut('GTK_SCROLL_NONE '); GTK_SCROLL_STEP_BACKWARD: DbgOut('GTK_SCROLL_STEP_BACKWARD '); GTK_SCROLL_STEP_FORWARD: DbgOut('GTK_SCROLL_STEP_FORWARD '); GTK_SCROLL_PAGE_BACKWARD: DbgOut('GTK_SCROLL_PAGE_BACKWARD '); GTK_SCROLL_PAGE_FORWARD: DbgOut('GTK_SCROLL_PAGE_FORWARD '); GTK_SCROLL_JUMP: DbgOut('GTK_SCROLL_JUMP '); - else DbgOut(IntToStr(Scroll_Type(Range^)), '->?'); + {$ifdef gtk2} + GTK_SCROLL_STEP_UP: DbgOut('GTK_SCROLL_STEP_UP'); + GTK_SCROLL_STEP_DOWN: DbgOut('GTK_SCROLL_STEP_DOWN'); + GTK_SCROLL_PAGE_UP: DbgOut('GTK_SCROLL_PAGE_UP'); + GTK_SCROLL_PAGE_DOWN: DbgOut('GTK_SCROLL_PAGE_DOWN'); + GTK_SCROLL_STEP_LEFT: DbgOut('GTK_SCROLL_STEP_LEFT'); + GTK_SCROLL_STEP_RIGHT: DbgOut('GTK_SCROLL_STEP_RIGHT'); + GTK_SCROLL_PAGE_LEFT: DbgOut('GTK_SCROLL_PAGE_LEFT'); + GTK_SCROLL_PAGE_RIGHT: DbgOut('GTK_SCROLL_PAGE_RIGHT'); + GTK_SCROLL_START: DbgOut('GTK_SCROLL_START'); + GTK_SCROLL_END: DbgOut('GTK_SCROLL_END'); + {$endif} + else + DbgOut(IntToStr(Scroll), '->?'); end; - DbgOut('OLD_VALUE=', IntToStr(Round(Range^.old_value)),' '); - Debugln; -end; - -procedure DebugPolicy(Policy: TGtkUpdateType); -begin - DbgOut('POLICY='); - case policy of - GTK_UPDATE_CONTINUOUS: DbgOut('GTK_UPDATE_CONTINUOUS'); - GTK_UPDATE_DISCONTINUOUS: DbgOut('GTK_UPDATE_DISCONTINUOUS'); - GTK_UPDATE_DELAYED: DbgOut('GTK_UPDATE_DELAYED'); - end; - DebugLn; end; {$ENDIF VerboseGtkScrollbars} +function ScrollTypeToSbCode(IsVertSB: boolean; ScrollType:TGtkScrollType; + UpdatePolicy:TGtkUpdateType): Integer; +begin + case ScrollType of + GTK_SCROLL_STEP_BACKWARD: + if IsVertSB then + Result := SB_LINEUP + else + Result := SB_LINELEFT; + GTK_SCROLL_STEP_FORWARD: + if IsVertSB then + Result := SB_LINEDOWN + else + Result := SB_LINERIGHT; + GTK_SCROLL_PAGE_BACKWARD: + if IsVertSB then + Result := SB_PAGEUP + else + Result := SB_PAGELEFT; + GTK_SCROLL_PAGE_FORWARD: + if IsVertSB then + Result := SB_PAGEDOWN + else + Result := SB_PAGERIGHT; + {$ifdef GTK2} + GTK_SCROLL_STEP_UP: + Result := SB_LINEUP; + GTK_SCROLL_STEP_DOWN: + Result := SB_LINEDOWN; + GTK_SCROLL_PAGE_UP: + Result := SB_PAGEUP; + GTK_SCROLL_PAGE_DOWN: + Result := SB_PAGEDOWN; + GTK_SCROLL_STEP_LEFT: + Result := SB_LINELEFT; + GTK_SCROLL_STEP_RIGHT: + Result := SB_LINERIGHT; + GTK_SCROLL_PAGE_LEFT: + Result := SB_PAGELEFT; + GTK_SCROLL_PAGE_RIGHT: + Result := SB_PAGERIGHT; + GTK_SCROLL_START: + if IsVertSB then + Result := SB_TOP + else + Result := SB_LEFT; + GTK_SCROLL_END: + if IsVertSB then + Result := SB_BOTTOM + else + Result := SB_RIGHT; + {$endif} + else + begin + {$IFDEF VerboseGtkScrollbars} + debugln('ScrollTypeToSbCode: Scroll_type=', IntToStr(ScrollType)); + {$Endif} + if UpdatePolicy=GTK_UPDATE_CONTINUOUS then + Result := SB_THUMBTRACK + else + Result := SB_THUMBPOSITION; + end; + end; +end; + +function GTK26HScrollCB(Range:PGTKRAnge; Scroll: PGtkScrollType; Value: gdouble; + data: gpointer): gboolean; cdecl; +var + Msg: TLMHScroll; +begin + Result := CallBackDefaultReturn; + Msg.Msg := LM_HSCROLL; + with Msg do begin + pos := Round(Range^.Adjustment^.Value); + ScrollBar := HWND(Range); + ScrollCode := ScrollTypeToSbCode(False, Scroll^, + gtk_range_get_update_policy(Range)); + end; + DeliverMessage(Data, Msg); +end; + +function GTK26VScrollCB(Range:PGTKRAnge; Scroll: PGtkScrollType; Value: gdouble; + data: gpointer): gboolean; cdecl; +var + Msg: TLMVScroll; +begin + Result := CallBackDefaultReturn; + Msg.Msg := LM_VSCROLL; + with Msg do begin + pos := Round(Range^.Adjustment^.Value); + ScrollBar := HWND(Range); + ScrollCode := ScrollTypeToSbCode(True, Scroll^, + gtk_range_get_update_policy(Range)); + end; + DeliverMessage(Data, Msg); +end; + function GTKHScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl; var Msg: TLMHScroll; Scroll: PGtkRange; - UpdatePolicy: TGtkUpdateType; - RangeClass: PgtkRangeClass; + ScrollType: TGtkScrollType; begin Result := CallBackDefaultReturn; Assert(False, Format('Trace:[GTKHScrollCB] Value: %d', [RoundToInt(Adjustment^.Value)])); Scroll := PgtkRange(gtk_object_get_data(PGTKObject(Adjustment), 'ScrollBar')); - if Scroll=nil then exit; -{$ifdef gtk1} - RangeClass := PgtkRangeClass(PgtkObject(Scroll)^.klass); -{$else} - RangeClass := GTK_OBJECT_GET_CLASS(Scroll); -{$endif} - UpdatePolicy := gtk_range_get_update_policy(Scroll); - //X := integer(gtk_object_get_data(PGtkObject(Scroll), 'FinalEvent')); - //WriteLn('FINAL EVENT: ', X); - //BeginGDKErrorTrap; - //gdk_window_get_pointer(GetControlWindow(Scroll), @X, @Y, @Mask); - //EndGDKErrorTrap; - {$IFDEF VerboseGtkScrollbars} - DebugScrollEvent(Scroll); - DebugPolicy(UpdatePolicy); - {$ENDIF} - Msg.Msg := LM_HSCROLL; - with Msg do begin - pos := Round(Adjustment^.Value); - ScrollBar := HWND(Scroll); -{$ifdef gtk1} - case Scroll_type(Scroll^) of - GTK_SCROLL_NONE: - begin - ScrollCode := SB_THUMBTRACK; - if click_child(scroll^) = RangeClass^.Slider then - if UpdatePolicy <> GTK_UPDATE_CONTINUOUS then - ScrollCode := SB_THUMBPOSITION; - end; - GTK_SCROLL_STEP_BACKWARD: - ScrollCode := SB_LINELEFT; - GTK_SCROLL_STEP_FORWARD: - ScrollCode := SB_LINERIGHT; - GTK_SCROLL_PAGE_BACKWARD: - ScrollCode := SB_PAGELEFT; - GTK_SCROLL_PAGE_FORWARD: - ScrollCode := SB_PAGERIGHT; - else - begin - // GTK_SCROLL_JUMP and others not known? - {$IFDEF VerboseGtkScrollbars} - debugln('GTKVScrollCB: Scroll_type=', IntToStr(Scroll_type(Scroll^))); - {$Endif} - if UpdatePolicy=GTK_UPDATE_CONTINUOUS then - ScrollCode := SB_THUMBTRACK - else - ScrollCode := SB_THUMBPOSITION; - end; + if Scroll<>nil then begin + Msg.Msg := LM_HSCROLL; + with Msg do begin + pos := Round(Adjustment^.Value); + ScrollBar := HWND(Scroll); + ScrollType := get_gtk_scroll_type(Scroll); + ScrollCode := ScrollTypeToSbCode(False, ScrollType, + gtk_range_get_update_policy(Scroll)); end; -{$else} - {$warning gtk2 TODO} -{$endif} + DeliverMessage(Data, Msg); end; - DeliverMessage(Data, Msg); end; - -function GTKVScrollCB(Adjustment: PGTKAdjustment; - data: GPointer): GBoolean; cdecl; +function GTKVScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl; var Msg: TLMVScroll; Scroll: PGtkRange; - UpdatePolicy: TGtkUpdateType; - RangeClass: PgtkRangeClass; + ScrollType: TGtkScrollType; begin Result := CallBackDefaultReturn; Assert(False, Format('Trace:[GTKVScrollCB] Value: %d', [RoundToInt(Adjustment^.Value)])); Scroll := PgtkRange(gtk_object_get_data(PGTKObject(Adjustment), 'ScrollBar')); - if (Scroll=nil) then exit; -{$ifdef gtk1} - RangeClass := PgtkRangeClass(PgtkObject(Scroll)^.klass); -{$else} - RangeClass := GTK_OBJECT_GET_CLASS(Scroll); -{$endif} - UpdatePolicy := gtk_range_get_update_policy(Scroll); - //UpdatePolicy := TGtkUpdateType( gtk_object_get_data(PgtkObject(Scroll), 'UpdatePolicy')); - //WriteLn('FINAL EVENT: ', integer(gtk_object_get_data(PGtkObject(Scroll), 'FinalEvent'))); - //BeginGDKErrorTrap; - //gdk_window_get_pointer(GetControlWindow(Scroll), @X, @Y, @Mask); - //EndGDKErrorTrap; - {$IFDEF VerboseGtkScrollbars} - DebugScrollEvent(Scroll); - DebugPolicy(UpdatePolicy); - {$ENDIF} - Msg.Msg := LM_VSCROLL; - with Msg do begin - pos := Round(Adjustment^.Value); - ScrollBar := HWND(Scroll); -{$ifdef gtk1} - case Scroll_type(Scroll^) of - GTK_SCROLL_NONE: - begin - ScrollCode := SB_THUMBTRACK; - if click_child(scroll^) = RangeClass^.Slider then - if UpdatePolicy <> GTK_UPDATE_CONTINUOUS then - ScrollCode := SB_THUMBPOSITION; - end; - GTK_SCROLL_STEP_BACKWARD: - ScrollCode := SB_LINEUP; - GTK_SCROLL_STEP_FORWARD: - ScrollCode := SB_LINEDOWN; - GTK_SCROLL_PAGE_BACKWARD: - ScrollCode := SB_PAGEUP; - GTK_SCROLL_PAGE_FORWARD: - ScrollCode := SB_PAGEDOWN; - else - begin - // GTK_SCROLL_JUMP and others not known? - {$IFDEF VerboseGtkScrollbars} - debugln('GTKVScrollCB: Scroll_type=', IntToStr(Scroll_type(Scroll^))); - {$ENDIF} - if UpdatePolicy=GTK_UPDATE_CONTINUOUS then - ScrollCode := SB_THUMBTRACK - else - ScrollCode := SB_THUMBPOSITION; - end; + if Scroll<>nil then begin + Msg.Msg := LM_VSCROLL; + with Msg do begin + pos := Round(Adjustment^.Value); + ScrollBar := HWND(Scroll); + ScrollType := get_gtk_scroll_type(Scroll); + ScrollCode := ScrollTypeToSbCode(True, ScrollType, + gtk_range_get_update_policy(Scroll)); end; -{$else} - {$warning gtk2 TODO} -{$endif} + DeliverMessage(Data, Msg); end; - DeliverMessage(Data, Msg); end; - {------------------------------------------------------------------------------ Function: GTKKeySnooper Params: Widget: The widget for which this event is fired @@ -2986,6 +2991,9 @@ end; { ============================================================================= $Log$ + Revision 1.262 2005/02/15 10:33:31 mattias + fix gtk2 scrollbars from Jesus + Revision 1.261 2005/02/05 16:09:52 marc * first 64bit changes diff --git a/lcl/interfaces/gtk/gtkobject.inc b/lcl/interfaces/gtk/gtkobject.inc index 73a498c9b8..87d5854998 100644 --- a/lcl/interfaces/gtk/gtkobject.inc +++ b/lcl/interfaces/gtk/gtkobject.inc @@ -3110,7 +3110,7 @@ procedure TGtkWidgetSet.SetCallback(const AMsg: LongInt; const AGTKObject: PGTKO end; var - gObject, gFixed, gCore, Scroll: PGTKObject; + gObject, gFixed, gCore, Scroll, Adjustment: PGTKObject; begin if AGTKObject = nil then gObject := ObjectToGTKObject(ALCLObject) @@ -3469,46 +3469,54 @@ begin LM_HSCROLL: begin - //if ALCLObject is TCustomListView - //then begin - // ConnectSenderSignal(gObject, 'scroll-horizontal', @gtkLVHScroll); - //end - //else begin - If ALCLObject is TScrollBar then - ConnectSenderSignal( - PGTKObject(PgtkhScrollBar(gObject)^.Scrollbar.Range.Adjustment), - 'value-changed', @GTKHScrollCB) - else If ALCLObject is TScrollBox then begin - Scroll := gtk_object_get_data(gObject, odnScrollArea); - ConnectSenderSignal(PGTKObject(gtk_scrolled_window_get_hadjustment( - PGTKScrolledWindow(Scroll))), 'value-changed', @GTKHScrollCB); - end - else - ConnectSenderSignal(PGTKObject(gtk_scrolled_window_get_hadjustment( - PGTKScrolledWindow(gObject))), 'value-changed', @GTKHScrollCB); - //end; + if (gtk_major_version>=2)and(gtk_minor_version>=6) then begin + if ALCLObject is TScrollBar then + Scroll := PGtkObject(@PgtkhScrollBar(gObject)^.Scrollbar.Range) + else begin + if ALCLObject is TScrollBox then + gObject := gtk_object_get_data(gObject, odnScrollArea); + Scroll := PgtkObject(PGtkScrolledWindow(gObject)^.HScrollBar); + end; + ConnectSenderSignal(Scroll,'changed-value', @GTK26HScrollCB); + end else begin + if ALCLObject is TScrollBar then + Adjustment := PgtkObject(PgtkhScrollBar(gObject)^.Scrollbar.Range.Adjustment) + else if ALCLObject is TScrollBox then begin + Scroll := gtk_object_get_data(gObject, odnScrollArea); + Adjustment := PgtkObject(gtk_scrolled_window_get_hadjustment( + PGTKScrolledWindow(Scroll))); + end + else + Adjustment := PgtkObject(gtk_scrolled_window_get_hadjustment( + PGTKScrolledWindow(gObject))); + ConnectSenderSignal(Adjustment, 'value-changed', @GTKHScrollCB); + end; end; LM_VSCROLL: begin - //if ALCLObject is TCustomListView - //then begin - // ConnectSenderSignal(gObject, 'scroll-vertical', @gtkLVVScroll); - //end - //else begin - If ALCLObject is TScrollBar then - ConnectSenderSignal( - PGTKObject(PgtkhScrollBar(gObject)^.Scrollbar.Range.Adjustment), - 'value-changed', @GTKVScrollCB) - else If ALCLObject is TScrollBox then begin - Scroll := gtk_object_get_data(gObject, odnScrollArea); - ConnectSenderSignal(PGTKObject(gtk_scrolled_window_get_vadjustment( - PGTKScrolledWindow(Scroll))), 'value-changed', @GTKVScrollCB); - end - else - ConnectSenderSignal(PGTKObject(gtk_scrolled_window_get_vadjustment( - PGTKScrolledWindow(gObject))), 'value-changed', @GTKVScrollCB); - //end; + if (gtk_major_version>=2)and(gtk_minor_version>=6) then begin + if ALCLObject is TScrollBar then + Scroll := PGtkObject(@PgtkhScrollBar(gObject)^.Scrollbar.Range) + else begin + if ALCLObject is TScrollBox then + gObject := gtk_object_get_data(gObject, odnScrollArea); + Scroll := PGtkObject(PGtkScrolledWindow(gObject)^.VScrollBar); + end; + connectSenderSignal(Scroll,'changed-value', @GTK26VScrollCB); + end else begin + if ALCLObject is TScrollBar then + Adjustment := PGtkObject(PgtkhScrollBar(gObject)^.Scrollbar.Range.Adjustment) + else if ALCLObject is TScrollBox then begin + Scroll := gtk_object_get_data(gObject, odnScrollArea); + Adjustment := PGtkObject(gtk_scrolled_window_get_vadjustment( + PGTKScrolledWindow(Scroll))); + end + else + Adjustment := PGtkObject(gtk_scrolled_window_get_vadjustment( + PGTKScrolledWindow(gObject))); + ConnectSenderSignal(Adjustment, 'value-changed', @GTKVScrollCB); + end; end; LM_YEARCHANGED : //calendar @@ -7000,6 +7008,9 @@ end; { ============================================================================= $Log$ + Revision 1.625 2005/02/15 10:33:31 mattias + fix gtk2 scrollbars from Jesus + Revision 1.624 2005/02/05 16:09:52 marc * first 64bit changes diff --git a/lcl/interfaces/gtk/gtkproc.pp b/lcl/interfaces/gtk/gtkproc.pp index 2a4ce19dca..d2de33bd60 100644 --- a/lcl/interfaces/gtk/gtkproc.pp +++ b/lcl/interfaces/gtk/gtkproc.pp @@ -202,6 +202,10 @@ function gtkFocusInNotifyCB (widget: PGtkWidget; event: PGdkEvent; data: gpointer): GBoolean; cdecl; function gtkFocusOutNotifyCB (widget: PGtkWidget; event: PGdkEvent; data: gpointer): GBoolean; cdecl; +function GTK26HScrollCB(Range: PGTKRange; Scroll: PGtkScrollType; Value: gdouble; + data: gpointer): gboolean; cdecl; +function GTK26VScrollCB(Range: PGTKRange; Scroll: PGtkScrollType; Value: gdouble; + data: gpointer): gboolean; cdecl; function GTKHScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl; function GTKVScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl;