caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
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/


             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;
as well as URLs for NNTP newsgroup(s).