From: Matt Gushee <matt@gushee.net>
To: caml-list@inria.fr
Subject: LablGTK2: problem w/ GMain.Io
Date: Sun, 07 May 2006 13:12:23 -0600 [thread overview]
Message-ID: <445E4697.3010109@gushee.net> (raw)
Hello, all--
I suppose this question is best suited for the LablGTK list. But since I
have been trying to subscribe to that list for several days, and haven't
gotten any response yet ...
I have a GUI application (the Bantam file manager) that I originally
wrote in LablTk, and have just ported to LablGTK2. I wrote most of the
code on a Slackware 10.1 box using GODI with OCaml 3.08.4 and LablGTK2
20040716. The GTK2 version is 2.6.1. After implementing all current
features in GTK and eliminating most of the known serious bugs, I built
and installed the package on my other Linux box, which runs Arch Linux
0.7.1, with Ocaml-3.09.2, GTK2-2.8.17, and LablGTK2-2.6.0.
Since I found startup to be a bit slow with GTK, I implemented a 'daemon
mode' for the application. When you start it in daemon mode, the GUI is
initialized, but remains hidden until it receives a '%show' command via
a named pipe. Also, when you 'quit' the application via a keystroke
command or the window manager, it actually only hides the main window.
To actually quit the application in daemon mode, you send a '%quit'
command via the above-mentioned pipe.
Here's the problem: on the development (Slackware) box, I had the app
running in both normal (GUI shows on startup & is destroyed by quitting)
and daemon modes with no apparent problems. On the second box, normal
mode works fine; the app will also run in daemon mode. But when I
attempt to send a command to the app in daemon mode, I get the following
error message:
** (bantam.bin:13244): CRITICAL **: GIOChannel watch: callback raised \
an exception
The relevant code is as follows. Have I done something obviously wrong?
If not, can anyone suggest how to debug this? TIA for any assistance.
method daemon_setup () =
is_daemon <- true;
msg_pipe <- Filename.concat Util.temp_user_dir "message.pipe";
if not (Sys.file_exists Util.temp_user_dir) then
Unix.mkdir Util.temp_user_dir 0o755
else if Sys.file_exists msg_pipe then
Unix.unlink msg_pipe;
Unix.mkfifo msg_pipe 0o600;
msg_fd <-
Unix.openfile msg_pipe [Unix.O_RDONLY; Unix.O_NONBLOCK] 0o600;
let chan = GMain.Io.channel_of_descr msg_fd in
let watcher _ =
let cmdbuf = Buffer.create 4
and temp = " " in
let rec read_input ready =
let nchars = GMain.Io.read chan ~buf:temp ~pos:0 ~len:1 in
if nchars = 0 then ()
else
match temp with
| "%" -> read_input true
| "\n" -> read_input false
| s when ready -> (Buffer.add_string cmdbuf s; read_input
true)
| _ -> read_input false
and do_command cmdstring =
match cmdstring with
| "show" -> self#show ()
| "hide" -> self#hide ()
| "quit" -> self#really_quit ()
| "hup" -> self#hup ()
| cs -> self#warn ("Unknown command: " ^ cs) in
read_input false;
do_command (Buffer.contents cmdbuf);
true in
ignore (GMain.Io.add_watch ~cond:[`IN] ~callback:watcher chan)
--
Matt Gushee
The Reluctant Geek: http://matt.gushee.net/rg/
next reply other threads:[~2006-05-07 19:10 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-07 19:12 Matt Gushee [this message]
2006-05-08 18:25 ` [Caml-list] " Olivier Andrieu
2006-05-11 22:05 ` Matt Gushee
2006-05-11 23:13 ` Matthew Hannigan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=445E4697.3010109@gushee.net \
--to=matt@gushee.net \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox