From 983bc1227da76b2ab95f78a9df72be4e9f6d57da Mon Sep 17 00:00:00 2001 From: ajgenius Date: Fri, 3 Oct 2003 01:25:01 +0000 Subject: [PATCH] add more gtk1i<->gtk2 key & event wrappers, move more GTK2 workarounds from gtk to gtk2 interface, start GTK2 interface SetCallback git-svn-id: trunk@4697 - --- lcl/interfaces/gtk/gtkcallback.inc | 141 +++++--------------- lcl/interfaces/gtk/gtkproc.inc | 169 ++++++++++++------------ lcl/interfaces/gtk/gtkproc.pp | 103 +++++++++++++++ lcl/interfaces/gtk2/gtk2int.pas | 6 + lcl/interfaces/gtk2/gtk2object.inc | 201 +++++++++++++++++++++++++++++ 5 files changed, 432 insertions(+), 188 deletions(-) diff --git a/lcl/interfaces/gtk/gtkcallback.inc b/lcl/interfaces/gtk/gtkcallback.inc index 3a5f984bec..6c7216d7fc 100644 --- a/lcl/interfaces/gtk/gtkcallback.inc +++ b/lcl/interfaces/gtk/gtkcallback.inc @@ -173,7 +173,6 @@ end; the initialization of a widget. -------------------------------------------------------------------------------} - {$IFDEF CustomFonts} procedure ModifyWidgetStyle(AWinControl: TWinControl; AWidget: PGtkWidget); {$IFDEF Win32} @@ -184,6 +183,7 @@ end; var RCStyle: PGtkRcStyle; begin + {$IfDef GTK1} {$IFDEF NoStyle} exit; {$ENDIF} @@ -198,6 +198,7 @@ end; g_free(RCStyle^.font_name); RCStyle^.font_name:=nil; gtk_rc_style_unref(RCStyle); + {$EndIf} end; {$ENDIF not win32} {$ENDIF CustomFonts} @@ -275,13 +276,8 @@ end; function gtkshowCB( widget: PGtkWidget; data: gPointer) : GBoolean; cdecl; var Mess : TLMShowWindow; - Status : GBoolean; begin - {$ifdef GTK2} - Result := False; - {$Else} Result := True; - {$endif} EventTrace('show', data); if Widget=nil then ; @@ -289,38 +285,21 @@ begin Mess.Msg := LM_SHOWWINDOW; Mess.Show := True; - Status := DeliverMessage(Data, Mess) = 0; - - {$ifdef GTK2} - Result := False; - {$Else} - Result := Status; - {$endif} + Result := DeliverMessage(Data, Mess) = 0; end; function gtkHideCB( widget: PGtkWidget; data: gPointer) : GBoolean; cdecl; var Mess : TLMShowWindow; - Status : GBoolean; begin - {$ifdef GTK2} - Result := False; - {$Else} Result := True; - {$endif} EventTrace('hide', data); if Widget=nil then ; FillChar(Mess,SizeOf(Mess),0); Mess.Msg := LM_SHOWWINDOW; Mess.Show := False; - Status := DeliverMessage(Data, Mess) = 0; - - {$ifdef GTK2} - Result := False; - {$Else} - Result := Status; - {$endif} + Result := DeliverMessage(Data, Mess) = 0; end; function gtkactivateCB(widget: PGtkWidget; data: gPointer) : GBoolean; cdecl; @@ -601,27 +580,21 @@ var ShiftState: TShiftState; EventStopped: Boolean; TopLevel: PGtkWidget; - Status : GBoolean; - + theString : PPgChar; + procedure StopKeyEvent(const EventName: PChar); begin if not EventStopped then begin g_signal_stop_emission_by_name (GTK_OBJECT (Widget), EventName); EventStopped:=true; end; + gdk_event_key_get_string(Event, theString); If (Msg.CharCode >= 31) or (Msg.CharCode = 0) then begin {$IfNDef Win32} - {$IfDef GTK2} - If Event^._string <> nil then begin - Event^._string[0] := Char(Msg.CharCode); - Event^._string[1] := #0; + If theString^ <> nil then begin + theString^[0] := Char(Msg.CharCode); + theString^[1] := #0; end; - {$else} - If Event^.theString <> nil then begin - Event^.theString[0] := Char(Msg.CharCode); - Event^.theString[1] := #0; - end; - {$EndIf} {$EndIf} Event^.KeyVal := Msg.CharCode; If Msg.CharCode <> VK_UNKNOWN then @@ -635,7 +608,7 @@ var end; begin - Status := true; + Result := true; EventStopped:=false; @@ -650,11 +623,7 @@ begin //writeln('[GTKKeyUpDown] ',TControl(Data).Name,':',TControl(Data).ClassName,' ',Event^.theType); -{$ifdef GTK2} - case Event^._Type of -{$else} - case Event^.theType of -{$endif} + case gdk_event_get_type(Event) of GDK_KEY_RELEASE: begin {writeln('[GTKKeyUpDown] RELEASE ',TControl(Data).Name,':',TControl(Data).ClassName, @@ -673,7 +642,7 @@ begin Msg.Result:=0; Code := Msg.CharCode; NotifyApplicationUserInput(Msg.Msg); - Status := DeliverMessage(Data, Msg)=0; + Result := DeliverMessage(Data, Msg)=0; If Msg.CharCode <> Code then begin // key was handled by LCL @@ -708,7 +677,7 @@ begin // send the message directly to the LCL NotifyApplicationUserInput(Msg.Msg); //writeln('GTKKeyUpDown Key Send to ',TControl(Data).Name,':',TControl(Data).ClassName,' ',Code=VK_TAB); - status := DeliverMessage(Data, Msg)=0; + Result := DeliverMessage(Data, Msg)=0; If Msg.CharCode <> Code then begin // key was changed by LCL @@ -728,7 +697,7 @@ begin Msg.CharCode := KeyCode; Msg.Result:=0; // send the message directly (not queued) to the LCL - status:=DeliverMessage(Data, Msg)=0; + Result:=DeliverMessage(Data, Msg)=0; If Msg.CharCode <> KeyCode then begin // key was handled by lcl //writeln('GTKKeyUpDown Key CHANGED 2 ',TControl(Data).Name,':',TControl(Data).ClassName); @@ -744,14 +713,11 @@ begin and (PGtkWindow(TopLevel)^.focus_widget=Widget) then begin StopKeyEvent('key_press_event'); //writeln('GTKKeyUpDown ',TControl(Data).Name,':',TControl(Data).ClassName); - Status:=TControl(Data).PerformTab(not (ssShift in ShiftState)); - If Status then begin + Result:=TControl(Data).PerformTab(not (ssShift in ShiftState)); + If Result then begin {$IfNDef Win32} - {$ifdef GTK2} - Event^._String[0] := #0; - {$else} - Event^.theString[0] := #0; - {$EndIf} + gdk_event_key_get_string(Event, theString); + theString^[0] := #0; {$EndIf} Event^.KeyVal := 0; end; @@ -760,13 +726,6 @@ begin end; end; //writeln('AAA1 [GTKKeyUpDown] ',TControl(Data).Name,':',TControl(Data).ClassName,' Result=',Result); - - {$ifdef GTK2} - if not GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then - Status := False;//for now only handle custom widgets - {$endif} - - Result := Status; end; function GTKFocusCB( widget: PGtkWidget; event:PGdkEventFocus; @@ -809,11 +768,7 @@ begin writeln(''); {$ENDIF} - {$IfDef GTK2} - Result:=False; - {$Else} Result:=true; - {$EndIF} end; function GTKFocusCBAfter(widget: PGtkWidget; event:PGdkEventFocus; @@ -863,11 +818,7 @@ begin Assert(False, Format('Trace:TODO: [gtkfocusCB] %s finish', [TObject(Data).ClassName])); DeliverMessage(Data, Mess); - {$IfDef GTK2} - Result:=False; - {$Else} Result:=true; - {$EndIF} end; function GTKKillFocusCB(widget: PGtkWidget; event:PGdkEventFocus; @@ -910,11 +861,7 @@ begin writeln(''); {$ENDIF} - {$IfDef GTK2} - Result:=False; - {$Else} Result:=true; - {$EndIF} end; function GTKKillFocusCBAfter(widget: PGtkWidget; event:PGdkEventFocus; @@ -964,11 +911,7 @@ begin Assert(False, Format('Trace:TODO: [gtkkillfocusCB] %s finish', [TObject(Data).ClassName])); DeliverMessage(Data, Mess); - {$IfDef GTK2} - Result:=False; - {$Else} Result:=true; - {$EndIF} end; function gtkdestroyCB(widget: PGtkWidget; data: gPointer) : GBoolean; cdecl; @@ -1268,8 +1211,7 @@ var if (LastMouse.Down) and - (not (Event^.{$ifdef GTK2}_Type{$ELSE}theType{$ENDIF} - in [gdk_2button_press,gdk_3button_press])) + (not (gdk_event_get_type(Event) in [gdk_2button_press,gdk_3button_press])) then begin {$IFDEF VerboseMouseBugfix} writeln(' NO CLICK: LastMouse.Down=',LastMouse.Down, @@ -1282,12 +1224,8 @@ var IsMultiClick:=TestIfMultiClick; - {$ifdef GTK2} - case Event^._Type of - {$ELSE} - case Event^.theType of - {$ENDIF} - + case gdk_event_get_type(Event) of + gdk_2button_press: // the gtk itself has detected a double click if (LastMouse.ClickCount>=2) @@ -2006,15 +1944,11 @@ begin Result:=false; if (Widget=nil) then ; - {$ifdef GTK2} - case Event^._Type of - {$else} - case Event^.theType of - {$endif} - + case gdk_event_get_type(Event) of + GDK_KEY_RELEASE, GDK_KEY_PRESS: begin - if Event^.KeyVal={$ifdef GTK2}GDK_KEY_Escape{$else}GDK_Escape{$EndIf} + if Event^.KeyVal=GDK_KEY_Escape then begin StoreCommonDialogSetup(TCommonDialog(data)); TCommonDialog(data).UserChoice:=mrCancel; @@ -2880,17 +2814,10 @@ var begin if VirtKeyCode<>ListCode then UpdateExtraKeyState(ListCode,Pressed) - {$ifdef GTK2} - else if Event^._Type=GDK_KEY_PRESS then + else if gdk_event_get_type(Event)=GDK_KEY_PRESS then UpdateExtraKeyState(ListCode,true) - else if Event^._Type=GDK_KEY_RELEASE then + else if gdk_event_get_type(Event)=GDK_KEY_RELEASE then UpdateExtraKeyState(ListCode,false); - {$else} - else if Event^.theType=GDK_KEY_PRESS then - UpdateExtraKeyState(ListCode,true) - else if Event^.theType=GDK_KEY_RELEASE then - UpdateExtraKeyState(ListCode,false); - {$endif} end; begin @@ -2904,11 +2831,7 @@ begin CheckExtraKeyState(VK_SHIFT,ssShift in ShiftState); CheckExtraKeyState(VK_MENU,ssAlt in ShiftState); - {$ifdef GTK2} - case Event^._Type of - {$else} - case Event^.theType of - {$endif} + case gdk_event_get_type(Event) of GDK_KEY_PRESS: begin if KeyStateList.IndexOf(Pointer(ListCode)) <0 @@ -2930,8 +2853,7 @@ begin KeyStateList.Remove(Pointer(ListCode or KEYMAP_TOGGLE)); end; else - WriteLn(Format('ERROR: [GTKKeySnooper] Got unknown event %d',[ - {$ifdef GTK2}Event^._Type{$else}Event^.theType{$endif}])); + WriteLn(Format('ERROR: [GTKKeySnooper] Got unknown event %d',[gdk_event_get_type(Event)])); end; Result := 0; end; @@ -3185,6 +3107,11 @@ end; { ============================================================================= $Log$ + Revision 1.201 2003/10/03 01:25:01 ajgenius + add more gtk1i<->gtk2 key & event wrappers, + move more GTK2 workarounds from gtk to gtk2 interface, + start GTK2 interface SetCallback + Revision 1.200 2003/10/02 03:35:29 ajgenius more fixes for GTK2, synedit now mostly-useable diff --git a/lcl/interfaces/gtk/gtkproc.inc b/lcl/interfaces/gtk/gtkproc.inc index 907a8913b1..5d2347d443 100644 --- a/lcl/interfaces/gtk/gtkproc.inc +++ b/lcl/interfaces/gtk/gtkproc.inc @@ -64,6 +64,24 @@ begin result := gtk_widget_get_ythickness(gtk_widget_get_style(Style)); end; +procedure gdk_event_key_get_string(Event : PGDKEventKey; var theString : PPgchar); +begin + {$IfDef GTK2} + theString := @Event^._String; + {$Else} + theString := @Event^.TheString; + {$EndIF} +end; + +function gdk_event_get_type(Event : Pointer) : guint; +begin + {$IfDef GTK2} + result := PGdkEvent(Event)^._type; + {$Else} + result := PGdkEvent(Event)^.TheType; + {$EndIF} +end; + {$Ifdef GTK1} function gtk_class_get_type(aclass : Pointer) : TGtkType; begin @@ -1275,200 +1293,192 @@ begin Dec(KeyCode, Ord('@')); end; - {$ifdef GTK2}GDK_key_dead_circumflex{$else}GDK_dead_circumflex{$EndIf}: + GDK_key_dead_circumflex: begin KeyCode := Ord('^'); end; - {$ifdef GTK2}GDK_KEY_KP_Space{$else}GDK_KP_Space{$EndIf}: + GDK_KEY_KP_Space: begin KeyCode := VK_SPACE; VirtualKey := VK_SPACE; end; - {$ifdef GTK2}GDK_KEY_KP_ENTER{$else}GDK_KP_ENTER{$EndIf}: + GDK_KEY_KP_ENTER: begin KeyCode := VK_Return; VirtualKey := VK_Return; end; - {$ifdef GTK2} - GDK_KEY_Tab, GDK_KEY_ISO_Left_Tab, GDK_KEY_KP_Tab - {$else} - GDK_Tab, GDK_ISO_Left_Tab, GDK_KP_Tab - {$EndIf}: + GDK_KEY_Tab, GDK_KEY_ISO_Left_Tab, GDK_KEY_KP_Tab: begin KeyCode := VK_TAB; VirtualKey := VK_TAB; end; - {$ifdef GTK2}GDK_KEY_RETURN{$else}GDK_Return{$EndIf}: + GDK_KEY_RETURN: begin KeyCode := VK_RETURN; VirtualKey := VK_RETURN; end; - {$ifdef GTK2}GDK_KEY_LINEFEED{$else}GDK_LINEFEED{$EndIf}: + GDK_KEY_LINEFEED: begin KeyCode := $0A; VirtualKey := $0A; end; // Cursor block / keypad - {$ifdef GTK2}GDK_KEY_INSERT{$else}GDK_INSERT{$EndIf}: + GDK_KEY_INSERT: begin VirtualKey := VK_INSERT; Extended := True; end; - {$ifdef GTK2}GDK_KEY_HOME{$else}GDK_HOME{$EndIf}: + GDK_KEY_HOME: begin VirtualKey := VK_HOME; Extended := True; end; - {$ifdef GTK2}GDK_KEY_LEFT{$else}GDK_LEFT{$EndIf}: + GDK_KEY_LEFT: begin VirtualKey := VK_LEFT; Extended := True; end; - {$ifdef GTK2}GDK_KEY_UP{$else}GDK_UP{$EndIf}: + GDK_KEY_UP: begin VirtualKey := VK_UP; Extended := True; end; - {$ifdef GTK2}GDK_KEY_RIGHT{$else}GDK_RIGHT{$EndIf}: + GDK_KEY_RIGHT: begin VirtualKey := VK_RIGHT; Extended := True; end; - {$ifdef GTK2}GDK_KEY_DOWN{$else}GDK_DOWN{$EndIf}: + GDK_KEY_DOWN: begin VirtualKey := VK_DOWN; Extended := True; end; - {$ifdef GTK2}GDK_KEY_Page_Up{$else}GDK_Page_Up{$EndIf}: + GDK_KEY_Page_Up: begin VirtualKey := VK_PRIOR; Extended := True; end; - {$ifdef GTK2}GDK_KEY_Page_Down{$else}GDK_Page_Down{$EndIf}: + GDK_KEY_Page_Down: begin VirtualKey := VK_NEXT; Extended := True; end; - {$ifdef GTK2}GDK_KEY_End{$else}GDK_End{$EndIf}: + GDK_KEY_End: begin VirtualKey := VK_END; Extended := True; end; - {$ifdef GTK2}GDK_KEY_KP_INSERT{$else}GDK_KP_INSERT{$EndIf}: + GDK_KEY_KP_INSERT: VirtualKey := VK_INSERT; - {$ifdef GTK2}GDK_KEY_KP_HOME{$else}GDK_KP_HOME{$EndIf}: + GDK_KEY_KP_HOME: VirtualKey := VK_HOME; - {$ifdef GTK2}GDK_KEY_KP_LEFT{$else}GDK_KP_LEFT{$EndIf}: + GDK_KEY_KP_LEFT: VirtualKey := VK_LEFT; - {$ifdef GTK2}GDK_KEY_KP_UP{$else}GDK_KP_UP{$EndIf}: + GDK_KEY_KP_UP: VirtualKey := VK_UP; - {$ifdef GTK2}GDK_KEY_KP_RIGHT{$else}GDK_KP_RIGHT{$EndIf}: + GDK_KEY_KP_RIGHT: VirtualKey := VK_RIGHT; - {$ifdef GTK2}GDK_KEY_KP_DOWN{$else}GDK_KP_DOWN{$EndIf}: + GDK_KEY_KP_DOWN: VirtualKey := VK_DOWN; - {$ifdef GTK2}GDK_KEY_KP_PAGE_UP{$else}GDK_KP_PAGE_UP{$EndIf}: + GDK_KEY_KP_PAGE_UP: VirtualKey := VK_PRIOR; - {$ifdef GTK2}GDK_KEY_KP_PAGE_DOWN{$else}GDK_KP_PAGE_DOWN{$EndIf}: + GDK_KEY_KP_PAGE_DOWN: VirtualKey := VK_NEXT; - {$ifdef GTK2}GDK_KEY_KP_END{$else}GDK_KP_END{$EndIf}: + GDK_KEY_KP_END: VirtualKey := VK_END; - {$ifdef GTK2}GDK_KEY_Num_Lock{$else}GDK_Num_Lock{$EndIf}: + GDK_KEY_Num_Lock: VirtualKey := VK_NUMLOCK; - {$ifdef GTK2}GDK_KEY_KP_F1{$else}GDK_KP_F1{$EndIf}: + GDK_KEY_KP_F1: VirtualKey := VK_F1; - {$ifdef GTK2}GDK_KEY_KP_F2{$else}GDK_KP_F2{$EndIf}: + GDK_KEY_KP_F2: VirtualKey := VK_F2; - {$ifdef GTK2}GDK_KEY_KP_F3{$else}GDK_KP_F3{$EndIf}: + GDK_KEY_KP_F3: VirtualKey := VK_F3; - {$ifdef GTK2}GDK_KEY_KP_F4{$else}GDK_KP_F4{$EndIf}: + GDK_KEY_KP_F4: VirtualKey := VK_F4; - {$ifdef GTK2}GDK_KEY_KP_EQUAL{$else}GDK_KP_EQUAL{$EndIf}: + GDK_KEY_KP_EQUAL: begin VirtualKey := VK_EQUAL; if not (ssCtrl in ShiftState) then KeyCode := Ord('='); end; - {$ifdef GTK2}GDK_KEY_KP_Multiply{$else}GDK_KP_Multiply{$EndIf}: + GDK_KEY_KP_Multiply: begin VirtualKey := VK_MULTIPLY; if not (ssCtrl in ShiftState) then KeyCode := Ord('*'); end; - {$ifdef GTK2}GDK_KEY_KP_Add{$else}GDK_KP_Add{$EndIf}: + GDK_KEY_KP_Add: begin VirtualKey := VK_ADD; if not (ssCtrl in ShiftState) then KeyCode := Ord('+'); end; - {$ifdef GTK2}GDK_KEY_KP_Separator{$else}GDK_KP_Separator{$EndIf}: + GDK_KEY_KP_Separator: begin VirtualKey := VK_SEPARATOR; // if not CtrlDown then KeyCode := Ord('????'); end; - {$ifdef GTK2}GDK_KEY_KP_Subtract{$else}GDK_KP_Subtract{$EndIf}: + GDK_KEY_KP_Subtract: begin VirtualKey := VK_SUBTRACT; if not (ssCtrl in ShiftState) then KeyCode := Ord('-'); end; - {$ifdef GTK2}GDK_KEY_KP_Decimal{$else}GDK_KP_Decimal{$EndIf}: + GDK_KEY_KP_Decimal: begin VirtualKey := VK_DECIMAL; if not (ssCtrl in ShiftState) then KeyCode := Ord('.'); end; - {$ifdef GTK2}GDK_KEY_KP_Divide{$else}GDK_KP_Divide{$EndIf}: + GDK_KEY_KP_Divide: begin VirtualKey := VK_DIVIDE; Extended := True; if not (ssCtrl in ShiftState) then KeyCode := Ord('/'); end; - {$ifdef GTK2} - GDK_KEY_KP_0..GDK_KEY_KP_9 - {$else} - GDK_KP_0..GDK_KP_9 - {$EndIf}: + GDK_KEY_KP_0..GDK_KEY_KP_9: begin VirtualKey := VK_NUMPAD0 + (Event^.KeyVal - - {$ifdef GTK2}GDK_KEY_KP_0{$else}GDK_KP_0{$EndIf}); + GDK_KEY_KP_0); if not (ssCtrl in ShiftState) then KeyCode := Ord('0') + (Event^.KeyVal - - {$ifdef GTK2}GDK_KEY_KP_0{$else}GDK_KP_0{$EndIf}); + GDK_KEY_KP_0); end; - {$ifdef GTK2}GDK_KEY_BackSpace{$else}GDK_BackSpace{$EndIf}: + GDK_KEY_BackSpace: VirtualKey := VK_BACK; - {$ifdef GTK2}GDK_KEY_Clear{$else}GDK_Clear_Key{$EndIf}: + GDK_KEY_Clear: VirtualKey := VK_CLEAR; - {$ifdef GTK2}GDK_KEY_Pause{$else}GDK_Pause{$EndIf}: + GDK_KEY_Pause: VirtualKey := VK_PAUSE; - {$ifdef GTK2}GDK_KEY_Scroll_Lock{$else}GDK_Scroll_Lock{$EndIf}: + GDK_KEY_Scroll_Lock: VirtualKey := VK_SCROLL; - {$ifdef GTK2}GDK_KEY_Sys_Req{$else}GDK_Sys_Req{$EndIf}: + GDK_KEY_Sys_Req: VirtualKey := VK_SNAPSHOT; - {$ifdef GTK2}GDK_KEY_Escape{$else}GDK_Escape{$EndIf}: + GDK_KEY_Escape: VirtualKey := VK_ESCAPE; - {$ifdef GTK2}GDK_KEY_Delete{$else}GDK_Delete_Key{$EndIf}: + GDK_KEY_Delete: VirtualKey := VK_DELETE; // GDK_Multi_key = $FF20; @@ -1476,7 +1486,7 @@ begin // GDK_MultipleCandidate = $FF3D; // GDK_PreviousCandidate = $FF3E; - {$ifdef GTK2}GDK_KEY_Kanji{$else}GDK_Kanji{$EndIf}: + GDK_KEY_Kanji: VirtualKey := VK_KANJI; // GDK_Muhenkan = $FF22; @@ -1498,59 +1508,59 @@ begin // GDK_Zen_Koho = $FF3D; // GDK_Mae_Koho = $FF3E; - {$ifdef GTK2}GDK_Key_Select{$else}GDK_Select{$EndIf}: + GDK_KEY_Select: VirtualKey := VK_SELECT; - {$ifdef GTK2}GDK_Key_Print{$else}GDK_Print{$EndIf}: + GDK_KEY_Print: VirtualKey := VK_PRINT; - {$ifdef GTK2}GDK_Key_Execute{$else}GDK_Execute{$EndIf}: + GDK_KEY_Execute: VirtualKey := VK_EXECUTE; - {$ifdef GTK2}GDK_Key_Menu{$else}GDK_Menu{$EndIf}: + GDK_KEY_Menu: VirtualKey := VK_MENU; // GDK_Find = $FF68; - {$ifdef GTK2}GDK_Key_Cancel{$else}GDK_Cancel{$EndIf}: + GDK_KEY_Cancel: VirtualKey := VK_CANCEL; - {$ifdef GTK2}GDK_Key_Help{$else}GDK_Help{$EndIf}: + GDK_KEY_Help: VirtualKey := VK_HELP; - {$ifdef GTK2}GDK_Key_Break{$else}GDK_Break{$EndIf}: + GDK_KEY_Break: VirtualKey := VK_CANCEL; - {$ifdef GTK2}GDK_Key_Mode_switch{$else}GDK_Mode_switch{$EndIf}: + GDK_KEY_Mode_switch: VirtualKey := VK_MODECHANGE; // GDK_script_switch = $FF7E; - {$ifdef GTK2}GDK_Key_Caps_Lock{$else}GDK_Caps_Lock{$EndIf}: + GDK_KEY_Caps_Lock: VirtualKey := VK_CAPITAL; // GDK_Shift_Lock = $FFE6; - {$ifdef GTK2}GDK_Key_Shift_L{$else}GDK_Shift_L{$EndIf}: + GDK_KEY_Shift_L: begin VirtualKey := VK_SHIFT; end; - {$ifdef GTK2}GDK_Key_Shift_R{$else}GDK_Shift_R{$EndIf}: + GDK_KEY_Shift_R: begin VirtualKey := VK_SHIFT; Extended := True; end; - {$ifdef GTK2}GDK_Key_Control_L{$else}GDK_Control_L{$EndIf}: + GDK_KEY_Control_L: begin VirtualKey := VK_CONTROL; end; - {$ifdef GTK2}GDK_Key_Control_R{$else}GDK_Control_R{$EndIf}: + GDK_KEY_Control_R: begin VirtualKey := VK_CONTROL; Extended := True; end; - {$ifdef GTK2}GDK_Key_Alt_L{$else}GDK_Alt_L{$EndIf}: + GDK_KEY_Alt_L: begin SysKey := True; VirtualKey:= VK_MENU; end; - {$ifdef GTK2}GDK_Key_Alt_R{$else}GDK_Alt_R{$EndIf}: + GDK_KEY_Alt_R: begin SysKey := True; VirtualKey:= VK_MENU; @@ -1558,21 +1568,13 @@ begin end; // Function keys - {$ifdef GTK2} - GDK_KEY_F1..GDK_KEY_F24 - {$else} - GDK_F1..GDK_F24 - {$EndIf}: + GDK_KEY_F1..GDK_KEY_F24: VirtualKey := VK_F1 + (Event^.KeyVal - - {$ifdef GTK2}GDK_Key_F1{$else}GDK_F1{$EndIf}); + GDK_KEY_F1); //By VVI - fixing cyrillic keys //GDK_* is like a koi8-r, it is KOI8-R code +$600. - {$ifdef GTK2} - GDK_KEY_cyrillic_io..GDK_KEY_cyrillic_Capital_hardsign - {$else} - GDK_cyrillic_io..GDK_cyrillic_Capital_hardsign - {$EndIf}: + GDK_KEY_cyrillic_io..GDK_KEY_cyrillic_Capital_hardsign: KeyCode := Event^.KeyVal mod $100; end; @@ -4897,6 +4899,11 @@ end; { ============================================================================= $Log$ + Revision 1.214 2003/10/03 01:25:01 ajgenius + add more gtk1i<->gtk2 key & event wrappers, + move more GTK2 workarounds from gtk to gtk2 interface, + start GTK2 interface SetCallback + Revision 1.213 2003/09/25 20:44:42 ajgenius minor changes for gtk2 diff --git a/lcl/interfaces/gtk/gtkproc.pp b/lcl/interfaces/gtk/gtkproc.pp index 77701c0756..ef94e80cc7 100644 --- a/lcl/interfaces/gtk/gtkproc.pp +++ b/lcl/interfaces/gtk/gtkproc.pp @@ -517,10 +517,113 @@ function gtk_widget_get_ythickness(Style : PGTKStyle) : gint; overload; function gtk_widget_get_xthickness(Style : PGTKWidget) : gint; overload; function gtk_widget_get_ythickness(Style : PGTKWidget) : gint; overload; +procedure gdk_event_key_get_string(Event : PGDKEventKey; var theString : PPgchar); +function gdk_event_get_type(Event : Pointer) : guint; + procedure BeginGDKErrorTrap; procedure EndGDKErrorTrap; {$Ifdef GTK1} + const + GDK_KEY_Escape = GDK_Escape; + GDK_key_dead_circumflex = GDK_dead_circumflex; + GDK_KEY_KP_Space = GDK_KP_Space; + GDK_KEY_KP_ENTER = GDK_KP_ENTER; + GDK_KEY_Tab = GDK_Tab; + GDK_KEY_ISO_Left_Tab = GDK_ISO_Left_Tab; + GDK_KEY_KP_Tab = GDK_KP_Tab; + GDK_KEY_RETURN = GDK_Return; + GDK_KEY_LINEFEED = GDK_LINEFEED; + GDK_KEY_INSERT = GDK_INSERT; + GDK_KEY_HOME = GDK_HOME; + GDK_KEY_LEFT = GDK_LEFT; + GDK_KEY_UP = GDK_UP; + GDK_KEY_RIGHT = GDK_RIGHT; + GDK_KEY_DOWN = GDK_DOWN; + GDK_KEY_Page_Up = GDK_Page_Up; + GDK_KEY_Page_Down = GDK_Page_Down; + GDK_KEY_End = GDK_End; + GDK_KEY_KP_INSERT = GDK_KP_INSERT; + GDK_KEY_KP_HOME = GDK_KP_HOME; + GDK_KEY_KP_LEFT = GDK_KP_LEFT; + GDK_KEY_KP_UP = GDK_KP_UP; + GDK_KEY_KP_RIGHT = GDK_KP_RIGHT; + GDK_KEY_KP_DOWN = GDK_KP_DOWN; + GDK_KEY_KP_PAGE_UP = GDK_KP_PAGE_UP; + GDK_KEY_KP_PAGE_DOWN = GDK_KP_PAGE_DOWN; + GDK_KEY_KP_END = GDK_KP_END; + GDK_KEY_Num_Lock = GDK_Num_Lock; + GDK_KEY_KP_F1 = GDK_KP_F1; + GDK_KEY_KP_F2 = GDK_KP_F2; + GDK_KEY_KP_F3 = GDK_KP_F3; + GDK_KEY_KP_F4 = GDK_KP_F4; + GDK_KEY_KP_EQUAL = GDK_KP_EQUAL; + GDK_KEY_KP_Multiply = GDK_KP_Multiply; + GDK_KEY_KP_Add = GDK_KP_Add; + GDK_KEY_KP_Separator = GDK_KP_Separator; + GDK_KEY_KP_Subtract = GDK_KP_Subtract; + GDK_KEY_KP_Decimal = GDK_KP_Decimal; + GDK_KEY_KP_Divide = GDK_KP_Divide: + GDK_KEY_KP_0 = GDK_KP_0; + GDK_KEY_KP_1 = GDK_KP_1; + GDK_KEY_KP_2 = GDK_KP_2; + GDK_KEY_KP_3 = GDK_KP_3; + GDK_KEY_KP_4 = GDK_KP_4; + GDK_KEY_KP_5 = GDK_KP_5; + GDK_KEY_KP_6 = GDK_KP_6; + GDK_KEY_KP_7 = GDK_KP_7; + GDK_KEY_KP_8 = GDK_KP_8; + GDK_KEY_KP_9 = GDK_KP_9; + GDK_KEY_BackSpace = GDK_BackSpace; + GDK_KEY_Clear = GDK_Clear_Key; + GDK_KEY_Pause = GDK_Pause; + GDK_KEY_Scroll_Lock = GDK_Scroll_Lock; + GDK_KEY_Sys_Req = GDK_Sys_Req; + GDK_KEY_Escape = GDK_Escape; + GDK_KEY_Delete = GDK_Delete_Key; + GDK_KEY_Kanji = GDK_Kanji; + GDK_KEY_Select = GDK_Select; + GDK_KEY_Print = GDK_Print; + GDK_KEY_Execute = GDK_Execute; + GDK_KEY_Menu = GDK_Menu; + GDK_KEY_Cancel = GDK_Cancel; + GDK_KEY_Help = GDK_Help; + GDK_KEY_Break = GDK_Break; + GDK_KEY_Mode_switch = GDK_Mode_switch; + GDK_KEY_Caps_Lock = GDK_Caps_Lock; + GDK_KEY_Shift_L = GDK_Shift_L; + GDK_KEY_Shift_R = GDK_Shift_R; + GDK_KEY_Control_L = GDK_Control_L; + GDK_KEY_Control_R = GDK_Control_R; + GDK_KEY_Alt_L = GDK_Alt_L; + GDK_KEY_Alt_R = GDK_Alt_R; + GDK_KEY_F1 = GDK_F1; + GDK_KEY_F2 = GDK_F2; + GDK_KEY_F3 = GDK_F3; + GDK_KEY_F4 = GDK_F4; + GDK_KEY_F5 = GDK_F5; + GDK_KEY_F6 = GDK_F6; + GDK_KEY_F7 = GDK_F7; + GDK_KEY_F8 = GDK_F8; + GDK_KEY_F9 = GDK_F9; + GDK_KEY_F10 = GDK_F10; + GDK_KEY_F11 = GDK_F11; + GDK_KEY_F12 = GDK_F12; + GDK_KEY_F13 = GDK_F13; + GDK_KEY_F14 = GDK_F14; + GDK_KEY_F15 = GDK_F15; + GDK_KEY_F16 = GDK_F16; + GDK_KEY_F17 = GDK_F17; + GDK_KEY_F18 = GDK_F18; + GDK_KEY_F19 = GDK_F19; + GDK_KEY_F20 = GDK_F20; + GDK_KEY_F21 = GDK_F21; + GDK_KEY_F22 = GDK_F22; + GDK_KEY_F23 = GDK_F23 + GDK_KEY_F24 = GDK_F24; + GDK_KEY_cyrillic_io = GDK_cyrillic_io; + GDK_KEY_cyrillic_Capital_hardsign = GDK_cyrillic_io..GDK_cyrillic_Capital_hardsign; + type PGtkOldEditable = PGtkEditable; diff --git a/lcl/interfaces/gtk2/gtk2int.pas b/lcl/interfaces/gtk2/gtk2int.pas index c48c7f620e..ab3c1a6c02 100644 --- a/lcl/interfaces/gtk2/gtk2int.pas +++ b/lcl/interfaces/gtk2/gtk2int.pas @@ -58,6 +58,7 @@ type procedure HookSignals(Sender: TObject); override; function IntSendMessage3(LM_Message : Integer; Sender : TObject; data : pointer) : integer; override; function LoadStockPixmap(StockID: longint) : HBitmap; override; + procedure SetCallback(Msg : LongInt; Sender: TObject); override; procedure SetLabel(Sender : TObject; Data : Pointer); override; function SetProperties(Sender : TObject) : integer; override; procedure SetSelectionMode(Sender: TObject; Widget: PGtkWidget; @@ -561,6 +562,11 @@ end. { $Log$ + Revision 1.24 2003/10/03 01:25:01 ajgenius + add more gtk1i<->gtk2 key & event wrappers, + move more GTK2 workarounds from gtk to gtk2 interface, + start GTK2 interface SetCallback + Revision 1.23 2003/10/02 18:15:44 ajgenius more gtk2 (check)ListBox implementation diff --git a/lcl/interfaces/gtk2/gtk2object.inc b/lcl/interfaces/gtk2/gtk2object.inc index 2e5bf01ab9..94f40564ca 100644 --- a/lcl/interfaces/gtk2/gtk2object.inc +++ b/lcl/interfaces/gtk2/gtk2object.inc @@ -22,6 +22,95 @@ // {$DEFINE ASSERT_IS_ON} {$ENDIF} +function GTK2FocusCB( widget: PGtkWidget; event:PGdkEventFocus; + data: gPointer) : GBoolean; cdecl; +var + Status : gBoolean; +begin + Status := GTKFocusCB(Widget, Event, Data); + + if GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then + Result := Status + else + Result := False; +end; + +function GTK2FocusCBAfter(widget: PGtkWidget; event:PGdkEventFocus; + data: gPointer) : GBoolean; cdecl; +var + Status : gBoolean; +begin + Status := GTKFocusCBAfter(Widget, Event, Data); + + if GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then + Result := Status + else + Result := False; +end; + +function gtk2HideCB( widget: PGtkWidget; data: gPointer) : GBoolean; cdecl; +var + Status : GBoolean; +begin + Status := gtkHideCB(Widget, Data); + + if GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then + Result := Status + else + Result := False; +end; + +function GTK2KeyUpDown(Widget: PGtkWidget; Event : pgdkeventkey; + Data: gPointer) : GBoolean; cdecl; +var + Status : gBoolean; +begin + Status := GTKKeyUpDown(Widget, Event, Data); + + if GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then + Result := Status + else + Result := False; +end; + +function GTK2KillFocusCB(widget: PGtkWidget; event:PGdkEventFocus; + data: gPointer) : GBoolean; cdecl; +var + Status : gBoolean; +begin + Status := GTKKillFocusCB(Widget, Event, Data); + + if GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then + Result := Status + else + Result := False; +end; + +function GTK2KillFocusCBAfter(widget: PGtkWidget; event:PGdkEventFocus; + data: gPointer) : GBoolean; cdecl; +var + Status : gBoolean; +begin + Status := GTKKillFocusCBAfter(Widget, Event, Data); + + if GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then + Result := Status + else + Result := False; +end; + +function gtk2showCB( widget: PGtkWidget; data: gPointer) : GBoolean; cdecl; +var + Status : GBoolean; +begin + Status := gtkshowCB(Widget, Data); + + if GtkWidgetIsA(Widget,GTK_APIWIDGETCLIENT_TYPE) then + Result := Status + else + Result := False; +end; + Procedure gtk_clb_toggle(cellrenderertoggle : PGtkCellRendererToggle; arg1 : PGChar; WinControl: TWinControl); cdecl; var @@ -744,6 +833,113 @@ begin // end; // end of 1st case end; +{------------------------------------------------------------------------------ + Function: TGTK2Object.SetCallback + Params: Msg - message for which to set a callback + sender - object to which callback will be send + Returns: nothing + + Applies a Message to the sender + ------------------------------------------------------------------------------} +procedure TGTK2Object.SetCallback(Msg : LongInt; Sender: TObject); + + procedure ConnectSenderSignal(const AnObject:PGTKObject; const ASignal: PChar; + const ACallBackProc: Pointer); + begin + ConnectSignal(AnObject,ASignal,ACallBackProc,TComponent(Sender)); + end; + + procedure ConnectSenderSignalAfter(const AnObject:PGTKObject; + const ASignal: PChar; const ACallBackProc: Pointer); + begin + ConnectSignalAfter(AnObject,ASignal,ACallBackProc,TComponent(Sender)); + end; + + procedure ConnectSenderSignal(const AnObject:PGTKObject; const ASignal: PChar; + const ACallBackProc: Pointer; const ReqSignalMask: TGdkEventMask); + begin + ConnectSignal(AnObject,ASignal,ACallBackProc,TComponent(Sender), + ReqSignalMask); + end; + + procedure ConnectSenderSignalAfter(const AnObject:PGTKObject; + const ASignal: PChar; const ACallBackProc: Pointer; + const ReqSignalMask: TGdkEventMask); + begin + ConnectSignalAfter(AnObject,ASignal,ACallBackProc,TComponent(Sender), + ReqSignalMask); + end; + + procedure ConnectFocusEvents(const AnObject: PGTKObject); + begin + ConnectSenderSignal(AnObject, 'focus-in-event', @gtk2FocusCB); + ConnectSenderSignalAfter(AnObject, 'focus-in-event', @gtk2FocusCBAfter); + ConnectSenderSignal(AnObject, 'focus-out-event', @gtk2KillFocusCB); + ConnectSenderSignalAfter(AnObject, 'focus-out-event', @gtk2KillFocusCBAfter); + end; + +var + gObject, gFixed, gCore, Scroll: PGTKObject; +begin + gObject := ObjectToGTKObject(Sender); + if gObject = nil then Exit; + + // gFixed is the widget with the client area (e.g. TGroupBox, TForm have this) + gFixed := PGTKObject(GetFixedWidget(gObject)); + if gFixed = nil then gFixed := gObject; + + // gCore is the main widget (e.g. TListView has this) + gCore:= PGtkObject(GetWidgetInfo(gObject, True)^.ImplementationWidget); + + case Msg of + LM_FOCUS : + begin + if (Sender is TCustomComboBox) then begin + ConnectFocusEvents(PgtkObject(PgtkCombo(gObject)^.entry)); + ConnectFocusEvents(PgtkObject(PgtkCombo(gObject)^.list)); + end else begin + ConnectFocusEvents(gCore); + end; + end; + + LM_CHAR, + LM_KEYDOWN, + LM_KEYUP, + + LM_SYSCHAR, + LM_SYSKEYDOWN, + LM_SYSKEYUP: + begin + if (Sender is TCustomComboBox) then begin + ConnectSenderSignal(PgtkObject(PgtkCombo(gObject)^.entry), + 'key-press-event', @GTK2KeyUpDown, GDK_KEY_PRESS_MASK); + ConnectSenderSignal(PgtkObject(PgtkCombo(gObject)^.entry), + 'key-release-event', @GTK2KeyUpDown, GDK_KEY_RELEASE_MASK); + end + else if (Sender is TCustomForm) then begin + ConnectSenderSignal(gObject, 'key-press-event', @GTK2KeyUpDown, + GDK_KEY_PRESS_MASK); + ConnectSenderSignal(gObject, 'key-release-event', @GTK2KeyUpDown, + GDK_KEY_RELEASE_MASK); + end; + ConnectSenderSignal(gCore, 'key-press-event', @GTK2KeyUpDown, + GDK_KEY_PRESS_MASK); + ConnectSenderSignal(gCore, 'key-release-event', @GTK2KeyUpDown, + GDK_KEY_RELEASE_MASK); + end; + + + LM_SHOWWINDOW : + begin + ConnectSenderSignal(gObject, 'show', @gtk2showCB); + ConnectSenderSignal(gObject, 'hide', @gtk2hideCB); + end; + + else + Inherited SetCallback(Msg, Sender); + end; +end; + Function TGtk2Object.LoadStockPixmap(StockID: longint) : HBitmap; var Pixmap : PGDIObject; @@ -1160,6 +1356,11 @@ end; { ============================================================================= $Log$ + Revision 1.5 2003/10/03 01:25:01 ajgenius + add more gtk1i<->gtk2 key & event wrappers, + move more GTK2 workarounds from gtk to gtk2 interface, + start GTK2 interface SetCallback + Revision 1.4 2003/10/02 18:15:44 ajgenius more gtk2 (check)ListBox implementation