Subversion Repositories Kolibri OS

Rev

Rev 643 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 643 Rev 666
Line 1... Line 1...
1
{}
1
{}
Line 2... Line 2...
2
 
2
 
3
procedure OpenStdout(var f: TextRec); forward;
3
procedure OpenStdout(var f: TextRec); forward;
-
 
4
procedure WriteStdout(var f: TextRec); forward;
4
procedure WriteStdout(var f: TextRec); forward;
5
procedure FlushStdout(var f: TextRec); forward;
Line 5... Line 6...
5
procedure CloseStdout(var f: TextRec); forward;
6
procedure CloseStdout(var f: TextRec); forward;
6
 
7
 
7
procedure OpenStdin(var f: TextRec); forward;
8
procedure OpenStdin(var f: TextRec); forward;
Line 18... Line 19...
18
end;
19
end;
Line 19... Line 20...
19
 
20
 
20
procedure OpenStdout(var f: TextRec);
21
procedure OpenStdout(var f: TextRec);
21
begin
22
begin
22
  TextRec(f).InOutFunc := @WriteStdout;
23
  TextRec(f).InOutFunc := @WriteStdout;
23
  TextRec(f).FlushFunc := @WriteStdout;
24
  TextRec(f).FlushFunc := @FlushStdout;
24
  TextRec(f).CloseFunc := @CloseStdout;
25
  TextRec(f).CloseFunc := @CloseStdout;
Line 25... Line 26...
25
end;
26
end;
26
 
27
 
Line 32... Line 33...
32
  SetLength(msg, f.bufpos);
33
  SetLength(msg, f.bufpos);
33
  f.bufpos := 0;
34
  f.bufpos := 0;
34
  Konsole.Write(msg);
35
  Konsole.Write(msg);
35
end;
36
end;
Line -... Line 37...
-
 
37
 
-
 
38
procedure FlushStdout(var f: TextRec);
-
 
39
begin
-
 
40
  WriteStdout(f);
-
 
41
  Konsole.Flush;
-
 
42
end;
36
 
43
 
37
procedure CloseStdout(var f: TextRec);
44
procedure CloseStdout(var f: TextRec);
38
begin
45
begin
Line 112... Line 119...
112
  {£®â®¢ ª ®¡à ¡®âª¥ ᮡë⨩}
119
  {£®â®¢ ª ®¡à ¡®âª¥ ᮡë⨩}
113
  Console^.FOpened := True;
120
  Console^.FOpened := True;
114
  while not Console^.FTerminate do
121
  while not Console^.FTerminate do
115
  begin
122
  begin
116
    Event := kos_getevent();
123
    Event := kos_getevent();
-
 
124
    Console^.FOnAir := True;
117
    if not Console^.FTerminate then
125
    if not Console^.FTerminate then
118
    case Event of
126
    case Event of
119
      SE_PAINT: Console^.Paint();
127
      SE_PAINT: Console^.Paint();
120
      SE_KEYBOARD: Console^.ProcessKeyboard(kos_getkey());
128
      SE_KEYBOARD: Console^.ProcessKeyboard(kos_getkey());
121
      SE_IPC: while Console^.ReceiveMessage(Message) do Console^.ProcessMessage(Message);
129
      SE_IPC: while Console^.ReceiveMessage(Message) do Console^.ProcessMessage(Message);
122
    end;
130
    end;
-
 
131
    Console^.FOnAir := False;
123
  end;
132
  end;
124
  Console^.FOpened := False;
133
  Console^.FOpened := False;
125
end;
134
end;
Line 126... Line 135...
126
 
135
 
Line 141... Line 150...
141
  FCursor.X := 1;
150
  FCursor.X := 1;
142
  FCursor.Y := 0;
151
  FCursor.Y := 0;
143
  FMaxLines := 150;
152
  FMaxLines := 150;
144
  FTerminate := False;
153
  FTerminate := False;
145
  FOpened := False;
154
  FOpened := False;
-
 
155
  FOnAir  := False;
146
  FIPCBufferSize := SizeOf(TKosIPC) + IPC_SIZE;
156
  FIPCBufferSize := SizeOf(TKosIPC) + IPC_SIZE;
147
  FIPCBuffer := GetMem(FIPCBufferSize);
157
  FIPCBuffer := GetMem(FIPCBufferSize);
148
  FIPCBuffer^.Lock := False;
158
  FIPCBuffer^.Lock := False;
149
  FIPCBuffer^.Size := 0;
159
  FIPCBuffer^.Size := 0;
150
  FThreadSlot := -1;
160
  FThreadSlot := -1;
151
  FThreadID := BeginThread(TThreadFunc(@KonsoleThreadMain), @Self);
161
  FThreadID := BeginThread(TThreadFunc(@KonsoleThreadMain), @Self);
152
  if FThreadID <> 0 then
162
  if FThreadID <> 0 then
153
    {XXX: ¬®¦¥â § ¢¨á­ãâì}
163
    {XXX: ¬®¦¥â § ¢¨á­ãâì}
154
    {‚®, â ª ¨ ¥áâì ¢ 2.2.0.}
-
 
155
    while not FOpened do ThreadSwitch;
164
    while not FOpened do ThreadSwitch;
156
end;
165
end;
Line 157... Line 166...
157
 
166
 
158
destructor TKonsole.Done();
167
destructor TKonsole.Done();
Line 162... Line 171...
162
  if FOpened then begin Self.Write(#0); kos_delay(10); end;
171
  if FOpened then begin Self.Write(#0); kos_delay(10); end;
163
  if FOpened then begin Self.Write(#0); kos_delay(20); end;
172
  if FOpened then begin Self.Write(#0); kos_delay(20); end;
164
  if FOpened then
173
  if FOpened then
165
  begin
174
  begin
166
    FOpened := False;
175
    FOpened := False;
-
 
176
    FOnAir  := False;
167
    KillThread(FThreadID);
177
    KillThread(FThreadID);
168
  end;
178
  end;
169
  FreeMem(FIPCBuffer);
179
  {FreeMem(FIPCBuffer);
170
  SetLength(FLines, 0);
180
  SetLength(FLines, 0);}
171
end;
181
end;
Line 172... Line 182...
172
 
182
 
173
function TKonsole.ReceiveMessage(var Message: ShortString): Boolean;
183
function TKonsole.ReceiveMessage(var Message: ShortString): Boolean;
174
{ˆ§¢«¥çì ¯¥à¢®¥ á®®¡é¥­¨¥ ¨§ ¡ãä¥à }
184
{ˆ§¢«¥çì ¯¥à¢®¥ á®®¡é¥­¨¥ ¨§ ¡ãä¥à }
175
var
185
var
176
  PMsg: PKosMessage;
186
  PMsg: PKosMessage;
177
  Size: Longword;
187
  Size: Longword;
-
 
188
begin
-
 
189
  FIPCBuffer^.Lock := True;
178
begin
190
 
179
  if FIPCBuffer^.Size > 0 then
191
  if FIPCBuffer^.Size > 0 then
180
  begin
-
 
181
    FIPCBuffer^.Lock := True;
192
  begin
182
    PMsg := Pointer(Longword(FIPCBuffer) + SizeOf(TKosIPC));
193
    PMsg := Pointer(Longword(FIPCBuffer) + SizeOf(TKosIPC));
183
    {TODO: ¯à®¢¥àª  PMsg^.SenderID}
194
    {TODO: ¯à®¢¥àª  PMsg^.SenderID}
184
    {Size := PMsg^.Size;
195
    {Size := PMsg^.Size;
185
    Dec(FIPCBuffer^.Size, Size + SizeOf(TKosMessage));
196
    Dec(FIPCBuffer^.Size, Size + SizeOf(TKosMessage));
Line 208... Line 219...
208
end;
219
end;
Line 209... Line 220...
209
 
220
 
210
procedure TKonsole.ProcessMessage(Message: ShortString);
221
procedure TKonsole.ProcessMessage(Message: ShortString);
211
{‚뢥á⨠ᮮ¡é¥­¨¥ ­  ª®­á®«ì}
222
{ ‚뢥á⨠ᮮ¡é¥­¨¥ ­  ª®­á®«ì }
212
var
-
 
213
  S: String;
-
 
214
  LinesCount: Word;
-
 
215
  CR, LF, W: Word;
223
var
216
  BottomRow: Boolean = True;
-
 
217
begin
-
 
Line 218... Line -...
218
  if Length(Message) < 1 then Exit;
-
 
219
 
-
 
220
  repeat
224
  OnlyBottomLine: Boolean = True;
221
    CR := Pos(#13, Message);
-
 
222
    LF := Pos(#10, Message);
-
 
223
    if (CR > 0) and ((CR < LF) or (LF <= 0)) then
-
 
224
      W := CR else
-
 
225
    if LF > 0 then
-
 
226
      W := LF else
-
 
227
      W := Length(Message) + 1;
225
 
228
    if W > 0 then
226
  procedure PutChar(C: Char);
229
    begin
-
 
230
      if W > 1 then
-
 
231
      begin
-
 
232
        S := Copy(Message, 1, W - 1);
-
 
233
        Delete(FLines[FCursor.Y], FCursor.X, Length(FLines[FCursor.Y]) - FCursor.X);
227
  var
234
        Insert(S, FLines[FCursor.Y], FCursor.X);
228
    LinesCount: Longint;
235
        Inc(FCursor.X, Length(S));
-
 
236
      end;
-
 
237
      Delete(Message, 1, W);
-
 
238
      if W = CR then
-
 
239
        {¯¥à¥¢®¤ ª®à¥âª¨ ¢ ­ ç «® áâப¨}
-
 
240
        FCursor.X := 1 else
229
    PLine: PShortString;
-
 
230
    I: Longint;
-
 
231
  begin
-
 
232
    { ¯¥à¥¢®¤ ª®à¥âª¨ ­  ¯®§¨æ¨î ¢«¥¢® }
-
 
233
    if C = #8 then
-
 
234
    begin
-
 
235
      if FCursor.X > 1 then
-
 
236
        Dec(FCursor.X);
241
      if W = LF then
237
    end else
-
 
238
 
-
 
239
    { ¯¥à¥¢®¤ ª®à¥âª¨ ­  á«¥¤ãîéãî áâபã }
242
      begin
240
    if C = #10 then
243
        {¯¥à¥¢®¤ ª®à¥âª¨ ­  á«¥¤ãîéãî áâபã}
241
    begin
244
        BottomRow := False;
242
      OnlyBottomLine := False;
245
        Inc(FCursor.Y);
243
      Inc(FCursor.Y);
246
        LinesCount := Length(FLines);
244
      LinesCount := Length(FLines);
247
        while FCursor.Y >= FMaxLines do Dec(FCursor.Y, FMaxLines);
245
      while FCursor.Y >= FMaxLines do Dec(FCursor.Y, FMaxLines);
248
        if FCursor.Y < LinesCount then FLines[FCursor.Y] := '';
246
      if FCursor.Y < LinesCount then FLines[FCursor.Y] := '';
249
        while FCursor.Y >= LinesCount do
247
      while FCursor.Y >= LinesCount do
250
        begin
248
      begin
251
          SetLength(FLines, LinesCount + 1);
249
        SetLength(FLines, LinesCount + 1);
252
          FLines[LinesCount] := '';
250
        FLines[LinesCount] := '';
-
 
251
        Inc(LinesCount);
-
 
252
      end;
-
 
253
    end else
-
 
254
 
-
 
255
    { ¯¥à¥¢®¤ ª®à¥âª¨ ¢ ­ ç «® áâப¨ }
-
 
256
    if C = #13 then
-
 
257
      FCursor.X := 1 else
-
 
258
 
-
 
259
    { ¯®¬¥é¥­¨¥ ᨬ¢®«  ¢ áâபã }
-
 
260
    begin
-
 
261
      if FCursor.X > 200 then
-
 
262
      begin
-
 
263
        PutChar(#13);
-
 
264
        PutChar(#10);
-
 
265
      end;
-
 
266
 
-
 
267
      { FIXME: …᫨ ¢ PascalMain ⮫쪮 ®¤¨­ Write/Ln, â® § ¢¨á®­.
-
 
268
        á¬. FPC_DO_EXIT, InternalExit }
-
 
269
      PLine := @FLines[FCursor.Y];
-
 
270
      I := Length(PLine^);
-
 
271
      if FCursor.X > I then
-
 
272
      begin
-
 
273
        SetLength(PLine^, FCursor.X);
-
 
274
        Inc(I);
-
 
275
        while I < FCursor.X do
-
 
276
        begin
253
          Inc(LinesCount);
277
          PLine^[I] := ' ';
254
        end;
278
          Inc(I);
255
      end;
279
        end;
Line -... Line 280...
-
 
280
      end;
-
 
281
      FLines[FCursor.Y][FCursor.X] := C;
-
 
282
 
-
 
283
      Inc(FCursor.X);
-
 
284
    end;
-
 
285
  end;
-
 
286
 
-
 
287
var
-
 
288
  I: Longint;
256
    end;
289
begin
257
  until Length(Message) <= 0;
290
  for I := 1 to Length(Message) do
Line 258... Line 291...
258
 
291
    PutChar(Message[I]);
259
  Paint(BottomRow);
292
  Paint(OnlyBottomLine);
260
end;
293
end;
Line 349... Line 382...
349
      Dec(I);
382
      Dec(I);
350
      ThreadSwitch;
383
      ThreadSwitch;
351
    end;
384
    end;
352
  end;
385
  end;
353
end;
386
end;
-
 
387
 
-
 
388
procedure TKonsole.Flush();
-
 
389
begin
-
 
390
  while FOnAir do ThreadSwitch;
-
 
391
end;