PowerShell and GTK-Server
Another little five-finger exercise, porting the example VBScript stdin driver to PowerShell. The only annoying thing is that the Start-Process
cmdlet doesn't give you direct access to the streams, so we have to drop into .net to fire up the GTK server process.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.SYNOPSIS | |
demo to use the GTK-server using STDIN. | |
.DESCRIPTION | |
This script is based on the VBScript example by | |
Peter van Eerten published at http://www.gtk-server.org/demo-stdin.vbs.txt | |
.NOTES | |
File Name : Try-GTKServer.ps1 | |
Requires : PowerShell Version 1.0 | |
.PARAMETER Help | |
Show this help text. | |
#> | |
param ( | |
[switch] $Help) | |
if ($help) | |
{ | |
Get-Help $MyInvocation.MyCommand.Definition | |
return | |
} | |
# hard-coded rather than passed in as a parameter | |
# I'm feeling lazy tonight... | |
$gtkpath = "path\to\gtk-server.exe" | |
## As we want to get at the process stdin, stdout we can't use the Start-Process cmdlet | |
## $gtkserver = Start-Process -FilePath $gtkpath -ArgumentList "-stdin" -PassThru | |
## which only allows file I/O | |
$gtkinfo = new-object System.Diagnostics.ProcessStartInfo @($gtkpath, "-stdin") | |
$gtkinfo.UseShellExecute = $false | |
$gtkinfo.RedirectStandardInput = $true | |
$gtkinfo.RedirectStandardOutput = $true | |
$gtkinfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden | |
$gtkserver = [System.Diagnostics.Process]::start($gtkinfo) | |
Function Invoke-GTK | |
{ | |
Param([string] $command) | |
$gtkserver.StandardInput.WriteLine($command) | |
$line = $gtkserver.StandardOutput.ReadLine() | |
if ($line -cne "ok") { $line } | |
} | |
#Define GUI | |
Invoke-GTK("gtk_init NULL NULL") | |
$win = Invoke-GTK("gtk_window_new 0") | |
Invoke-GTK("gtk_window_set_title $win `"PowerShell Script demo program using STDIN`"") | |
Invoke-GTK("gtk_widget_set_usize $win 450 400") | |
$table = Invoke-GTK("gtk_table_new 50 50 1") | |
Invoke-GTK("gtk_container_add $win $table" ) | |
$button = Invoke-GTK("gtk_button_new_with_label Exit") | |
Invoke-GTK("gtk_table_attach_defaults $table $button 41 49 45 49") | |
$entry = Invoke-GTK("gtk_entry_new") | |
Invoke-GTK("gtk_table_attach_defaults $table $entry 1 40 45 49") | |
$text = Invoke-GTK("gtk_text_new NULL NULL") | |
Invoke-GTK("gtk_table_attach_defaults $table $text 1 49 8 44") | |
$radio1 = Invoke-GTK("gtk_radio_button_new_with_label_from_widget NULL Yes") | |
Invoke-GTK("gtk_table_attach_defaults $table $radio1 1 10 1 4") | |
$radio2 = Invoke-GTK("gtk_radio_button_new_with_label_from_widget $radio1 No") | |
Invoke-GTK("gtk_table_attach_defaults $table $radio2 1 10 4 7") | |
Invoke-GTK("gtk_widget_show_all $win" ) | |
Invoke-GTK("gtk_widget_grab_focus $entry" ) | |
# message/event loop | |
do { | |
$event = Invoke-GTK("gtk_server_callback wait") | |
if ($event -ceq $entry) { | |
$tmp = Invoke-GTK("gtk_entry_get_text $entry" ) | |
if($tmp.Length -gt 1) { | |
Invoke-GTK("gtk_text_insert $text NULL NULL NULL `"$tmp`n`" -1") | |
} | |
# Empty entry field | |
Invoke-GTK("gtk_editable_delete_text $entry 0 -1") | |
} | |
} while ($event -cne $button) | |
Invoke-GTK("gtk_server_exit") |
No comments :
Post a Comment