testzvt.pp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. {
  2. $Id$
  3. TestZVT - An FPC Example Program demonstrating the most common use
  4. of ZVTTerm in a GNOME application.
  5. Copyright (C) 2002 Andrew Johnson <[email protected]>
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU Lesser General Public
  8. License as published by the Free Software Foundation; either
  9. version 2 of the License, or (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. Lesser General Public License for more details.
  14. You should have received a copy of the GNU Lesser General Public
  15. License along with this library; if not, write to the
  16. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  17. Boston, MA 02111-1307, USA.
  18. **********************************************************************}
  19. Program TestZVT;
  20. (* Try to Execute mc (midnight commander) instead of sh *)
  21. {$Define exec_mc}
  22. Uses
  23. SysUtils,
  24. { Linux/UNIX Unit, for execvp }
  25. {$IfDef ver1_0}linux{$Else}Unix{$EndIF},
  26. { Standard GTK+ 1.x Interface }
  27. glib, gdk, gtk,
  28. { Standard GNOME 1.x Interface }
  29. libgnome, libgnomeui,
  30. { Standard libzvt 1.x Interface }
  31. libzvt;
  32. const
  33. (* what to execvp in terminal widget *)
  34. {$Ifdef exec_mc}
  35. Command : PChar = 'mc';
  36. Params : array[0..1] of PChar = ('TERM=xterm', nil);
  37. {$else}
  38. Command : PChar = 'sh';
  39. Params : array[0..0] of PChar = (nil);
  40. {$EndIf}
  41. Terminals : Longint = 0;//# of terminals currently open
  42. (* Program Information for GNOME & About Box *)
  43. ProgramName : PChar = 'TestZVT';
  44. ProgramVersion : PChar = '1.0';
  45. (* Information for About Box *)
  46. Copyright : PChar = 'Copyright (C) 2002 Andrew Johnson';
  47. Authors : array[0..1] of PChar = ('Andrew Johnson <[email protected]>', nil);
  48. Comments : PChar = 'An FPC Example Program demonstrating the most common use of ZVTTerm in a GNOME application.';
  49. var
  50. app, mdichild : pointer;
  51. Procedure quit_testzvt(Widget : PGTKWidget; Data : Pointer); cdecl;
  52. begin
  53. (* Quite Main Loop *)
  54. gtk_main_quit;
  55. end;
  56. Procedure exit_terminal(Widget : PGTKWidget; Data : Pointer); cdecl;
  57. begin
  58. (* Destroy terminal on process exit, and quit if only terminal open *)
  59. gnome_mdi_remove_view(App, Data, 1);
  60. Dec(Terminals);
  61. end;
  62. Procedure close_activechild(Widget : PGTKWidget; Data : Pointer); cdecl;
  63. begin
  64. (* close active view *)
  65. exit_terminal(Widget, gnome_mdi_get_active_view(App));
  66. end;
  67. Procedure new_child(Widget : PGTKWidget; Data : Pointer); cdecl;
  68. begin
  69. (* create new view& set active *)
  70. gnome_mdi_add_view(app, mdichild);
  71. end;
  72. Procedure about_testzvt(Widget : PGTKWidget; Data : Pointer); cdecl;
  73. var
  74. AboutBox : Pointer;
  75. begin
  76. (* Create and Run an About Box *)
  77. AboutBox := gnome_about_new(gnome_app_id, ProgramVersion, Copyright,
  78. @Authors[0],Comments,nil);
  79. gnome_dialog_set_parent(AboutBox, GTK_Window(gnome_mdi_get_active_window(App)));
  80. gnome_dialog_run_and_close(AboutBox);
  81. end;
  82. Procedure show_terminal(Widget : PGTKWidget; Data : Pointer); cdecl;
  83. begin
  84. (* fork terminal process, and Exec Command *)
  85. If zvt_term_forkpty(ZVT_TERM(Widget), ZVT_TERM_DO_UTMP_LOG or ZVT_TERM_DO_WTMP_LOG or ZVT_TERM_DO_LASTLOG) = 0 then
  86. execvp (Command, @Command, @Params[0]);
  87. (* close app when fork'ed terminal process finishes/dies *)
  88. gtk_signal_connect (GTK_OBJECT(Widget), 'child_died', GTK_SIGNAL_FUNC (@exit_terminal), Data);
  89. end;
  90. Function NewTerminalView: PGTKWidget; cdecl;
  91. var
  92. hBox, SB, Term : gPointer;
  93. begin
  94. (* Create hbox for layout of Terminal/Scrollbar *)
  95. hBox := gtk_hbox_new(FALSE, 0);
  96. term := zvt_term_new_with_size(80,30);//start with average size
  97. (* Set up terminal options *)
  98. zvt_term_set_shadow_type(term, GTK_SHADOW_IN);//give the terminal a small indented frame
  99. zvt_term_set_font_name(term, '-misc-fixed-medium-r-normal-*-12-200-*-*-c-75-*-*');
  100. zvt_term_set_scrollback(term, 10000);//give a decent amount of scrollback
  101. zvt_term_set_scroll_on_keystroke(term, True);//default on most terminals
  102. zvt_term_set_scroll_on_output(term, False);//default on most terminals
  103. zvt_term_set_background(ZVT_TERM (term), nil, False, 0);//ensure is not transparent
  104. gtk_signal_connect_after(term, 'show', GTK_SIGNAL_FUNC (@show_terminal), hBox);
  105. (* Create scrollbar *)
  106. sb := gtk_vscrollbar_new(GTK_ADJUSTMENT (ZVT_TERM(term)^.adjustment));
  107. GTK_WIDGET_UNSET_FLAGS(sb, GTK_CAN_FOCUS);//Should never capture keyboard
  108. (* Pack Box *)
  109. gtk_box_pack_start(hBox, term, TRUE, TRUE, 0);
  110. gtk_box_pack_start(hBox, sb, FALSE, TRUE, 0);
  111. gtk_object_set_data(hbox, 'caption', Pchar('Terminal #' + IntToStr(Terminals)));
  112. gtk_widget_show_all(hBox);
  113. NewTerminalView := hBox;
  114. Inc(Terminals);
  115. end;
  116. Function CreateMDIChildWidget : Pointer;
  117. var
  118. child : Pointer;
  119. begin
  120. child := gnome_mdi_generic_child_new('Terminal');
  121. gnome_mdi_generic_child_set_view_creator(child, @NewTerminalView, nil);
  122. CreateMDIChildWidget := child;
  123. end;
  124. var
  125. file_menu : array[0..4] of TGnomeUIInfo;
  126. help_menu : array[0..1] of TGnomeUIInfo;
  127. Menus : array[0..2] of TGnomeUIInfo;
  128. begin
  129. (* Initialize GNOME with Current Program Name and Version *)
  130. gnome_init(ProgramName, ProgramVersion, argc, argv);
  131. (* Create Main App *)
  132. app := gnome_mdi_new(gnome_app_id, 'FPC GNOME ZVT Test');
  133. gtk_signal_connect(app, 'destroy', GTK_SIGNAL_FUNC (@quit_testzvt), nil);
  134. (* Create Stock Menus *)
  135. file_menu[0] := GNOMEUIINFO_MENU_NEW_ITEM('New Shell Process', 'Opens a new shell process', @new_child, nil);
  136. file_menu[1] := GNOMEUIINFO_MENU_CLOSE_ITEM(@close_activechild,nil);
  137. file_menu[2] := GNOMEUIINFO_SEPARATOR;
  138. file_menu[3] := GNOMEUIINFO_MENU_EXIT_ITEM(@quit_testzvt,nil);
  139. file_menu[4] := GNOMEUIINFO_END;
  140. help_menu[0] := GNOMEUIINFO_MENU_ABOUT_ITEM(@about_testzvt, app);
  141. help_menu[1] := GNOMEUIINFO_END;
  142. menus[0] := GNOMEUIINFO_MENU_FILE_TREE(@file_menu[0]);
  143. menus[1] := GNOMEUIINFO_MENU_HELP_TREE(@help_menu[0]);
  144. menus[2] := GNOMEUIINFO_END;
  145. mdichild := CreateMDIChildWidget;
  146. (* Set App Menu/Contents, and Show All *)
  147. gnome_mdi_set_mode(App, GNOME_MDI_NOTEBOOK);
  148. gnome_mdi_set_menubar_template(App, @Menus[0]);
  149. gnome_mdi_open_toplevel(app);
  150. gnome_mdi_add_child(app, mdichild);
  151. gnome_mdi_add_view(app, mdichild);
  152. gnome_mdi_add_view(app, mdichild);
  153. (* Run Main Loop *)
  154. gtk_main();
  155. (* cleanup and exit *)
  156. gtk_exit(0);
  157. end.
  158. {
  159. $Log$
  160. Revision 1.1 2002-10-17 14:15:50 peter
  161. * zvt conversion by Andrew Johnson
  162. }