You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lcoregtklaz.pas 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. { Copyright (C) 2005 Bas Steendijk and Peter Green
  2. For conditions of distribution and use, see copyright notice in zlib_license.txt
  3. which is included in the package
  4. ----------------------------------------------------------------------------- }
  5. unit lcoregtklaz;
  6. {$mode delphi}
  7. interface
  8. uses baseunix,unix,glib, gdk, gtk,lcore,forms,fd_utils,classes;
  9. //procedure lcoregtklazrun;
  10. const
  11. G_IO_IN=1;
  12. G_IO_OUT=4;
  13. G_IO_PRI=2;
  14. G_IO_ERR=8;
  15. G_IO_HUP=16;
  16. G_IO_NVAL=32;
  17. type
  18. tlaztimerwrapperinterface=class(ttimerwrapperinterface)
  19. public
  20. function createwrappedtimer : tobject;override;
  21. // procedure setinitialevent(wrappedtimer : tobject;newvalue : boolean);override;
  22. procedure setontimer(wrappedtimer : tobject;newvalue:tnotifyevent);override;
  23. procedure setenabled(wrappedtimer : tobject;newvalue : boolean);override;
  24. procedure setinterval(wrappedtimer : tobject;newvalue : integer);override;
  25. end;
  26. procedure lcoregtklazinit;
  27. implementation
  28. uses
  29. ExtCtrls;
  30. {$I unixstuff.inc}
  31. var
  32. giochannels : array[0..absoloutemaxs] of pgiochannel;
  33. function iocallback(source:PGIOChannel; condition:TGIOCondition; data:gpointer):gboolean;cdecl;
  34. // return true if we want the callback to stay
  35. var
  36. fd : integer ;
  37. fdsrlocal , fdswlocal : fdset ;
  38. currentasio : tlasio ;
  39. begin
  40. fd := g_io_channel_unix_get_fd(source);
  41. fd_zero(fdsrlocal);
  42. fd_set(fd,fdsrlocal);
  43. fdswlocal := fdsrlocal;
  44. select(fd+1,@fdsrlocal,@fdswlocal,nil,0);
  45. if fd_isset(fd,fdsrlocal) or fd_isset(fd,fdsrlocal) then begin
  46. currentasio := fdreverse[fd];
  47. if assigned(currentasio) then begin
  48. currentasio.handlefdtrigger(fd_isset(currentasio.fdhandlein,fdsrlocal),fd_isset(currentasio.fdhandleout,fdswlocal));
  49. end else begin
  50. rmasterclr(fd);
  51. wmasterclr(fd);
  52. end;
  53. end;
  54. case condition of
  55. G_IO_IN : begin
  56. result := rmasterisset(fd);
  57. end;
  58. G_IO_OUT : begin
  59. result := wmasterisset(fd);
  60. end;
  61. end;
  62. end;
  63. procedure gtkrmasterset(fd : integer);
  64. begin
  65. if not assigned(giochannels[fd]) then giochannels[fd] := g_io_channel_unix_new(fd);
  66. g_io_add_watch(giochannels[fd],G_IO_IN,iocallback,nil);
  67. end;
  68. procedure gtkrmasterclr(fd: integer);
  69. begin
  70. end;
  71. procedure gtkwmasterset(fd : integer);
  72. begin
  73. if not assigned(giochannels[fd]) then giochannels[fd] := g_io_channel_unix_new(fd);
  74. g_io_add_watch(giochannels[fd],G_IO_OUT,iocallback,nil);
  75. end;
  76. procedure gtkwmasterclr(fd: integer);
  77. begin
  78. end;
  79. type
  80. tsc = class
  81. procedure dotasksandsink(sender:tobject;error:word);
  82. end;
  83. var
  84. taskloopback : tlloopback;
  85. sc : tsc;
  86. procedure tsc.dotasksandsink(sender:tobject;error:word);
  87. begin
  88. with tlasio(sender) do begin
  89. sinkdata(sender,error);
  90. processtasks;
  91. end;
  92. end;
  93. procedure gtkaddtask(ahandler:ttaskevent;aobj:tobject;awparam,alparam:longint);
  94. begin
  95. taskloopback.sendstr(' ');
  96. end;
  97. procedure lcoregtklazinit;
  98. begin
  99. onrmasterset := gtkrmasterset;
  100. onrmasterclr := gtkrmasterclr;
  101. onwmasterset := gtkwmasterset;
  102. onwmasterclr := gtkwmasterclr;
  103. onaddtask := gtkaddtask;
  104. taskloopback := tlloopback.create(nil);
  105. taskloopback.ondataavailable := sc.dotasksandsink;
  106. timerwrapperinterface := tlaztimerwrapperinterface.create(nil);
  107. end;
  108. function tlaztimerwrapperinterface.createwrappedtimer : tobject;
  109. begin
  110. result := ttimer.create(nil);
  111. end;
  112. procedure tlaztimerwrapperinterface.setontimer(wrappedtimer : tobject;newvalue:tnotifyevent);
  113. begin
  114. ttimer(wrappedtimer).ontimer := newvalue;
  115. end;
  116. procedure tlaztimerwrapperinterface.setenabled(wrappedtimer : tobject;newvalue : boolean);
  117. begin
  118. ttimer(wrappedtimer).enabled := newvalue;
  119. end;
  120. procedure tlaztimerwrapperinterface.setinterval(wrappedtimer : tobject;newvalue : integer);
  121. begin
  122. ttimer(wrappedtimer).interval := newvalue;
  123. end;
  124. end.