Permalink
Browse files

new gtknode:cmd

  added "hello" example


git-svn-id: https://gtknode.googlecode.com/svn/trunk@26 9999ab98-4a1b-0410-ba6a-d90168ca9a37
  • Loading branch information...
1 parent 12b280a commit 76e05b97ee977610608685914101e111862f53d9 @massemanet massemanet committed Nov 27, 2006
View
@@ -17,15 +17,12 @@ void erl(GtkWidget *widget) {
GSignalInvocationHint *ihint = g_signal_get_invocation_hint(widget);
const gchar *signalname = g_signal_name(ihint->signal_id);
- g_message("g_quark_from_static_string %i",g_quark_from_static_string("GladeXML::name"));
if ( (widgetname = glade_get_widget_name(widget)) ) {
- g_message("gn_send_signal_1");
gn_send_signal(widgetname, signalname);
} else {
gn_store_obj(bf,G_OBJECT (widget));
gn_send_signal(bf, signalname);
}
- g_message("erl");
}
void gn_erl(GtkWidget *widget){
View
@@ -58,7 +58,6 @@ GType gn_GType_from_name(const gchar* name) {
return gtp;
/* try to instantiate the type */
tname = get_type_name(name);
- g_message("tname :%s:\n", tname);
if ( g_module_symbol(gmod, tname, (gpointer *)&func ) )
if ( (gtp = (*func)() ) )
return gtp;
View
@@ -58,6 +58,7 @@ AC_CONFIG_FILES([ \
priv/examples/points/Makefile \
priv/examples/top/Makefile \
priv/examples/hello_world/Makefile \
+ priv/examples/hello/Makefile \
priv/examples/treeview/Makefile \
doc/Makefile \
])
@@ -1,4 +1,4 @@
-SUBDIRS = points top hello_world treeview
+SUBDIRS = points top hello_world treeview hello
EXAMPLESDIR = $(ERLANG_INSTALL_LIB_DIR_gtknode)/examples
examplesdir = $(EXAMPLESDIR)
@@ -0,0 +1,14 @@
+EXAMPLESDIR = $(ERLANG_INSTALL_LIB_DIR_gtknode)/examples
+erlsrcdir = $(EXAMPLESDIR)/hello
+erlsrc_DATA = hello.erl
+EXTRA_DIST = $(erlsrc_DATA)
+
+erlbeamdir = $(erlsrcdir)
+erlbeam_DATA = hello.beam
+CLEANFILES = $(erlbeam_DATA)
+
+all: $(erlbeam_DATA)
+
+SUFFIXES = .erl .beam
+.erl.beam:
+ $(ERLC) $(ERLCFLAGS) $<
@@ -0,0 +1,98 @@
+#include <gtk/gtk.h>
+
+/* This is a callback function. The data arguments are ignored
+ * in this example. More on callbacks below. */
+static void hello( GtkWidget *widget,
+ gpointer data )
+{
+ g_print ("Hello World\n");
+}
+
+static gboolean delete_event( GtkWidget *widget,
+ GdkEvent *event,
+ gpointer data )
+{
+ /* If you return FALSE in the "delete_event" signal handler,
+ * GTK will emit the "destroy" signal. Returning TRUE means
+ * you don't want the window to be destroyed.
+ * This is useful for popping up 'are you sure you want to quit?'
+ * type dialogs. */
+
+ g_print ("delete event occurred\n");
+
+ /* Change TRUE to FALSE and the main window will be destroyed with
+ * a "delete_event". */
+
+ return TRUE;
+}
+
+/* Another callback */
+static void destroy( GtkWidget *widget,
+ gpointer data )
+{
+ gtk_main_quit ();
+}
+
+int main( int argc,
+ char *argv[] )
+{
+ /* GtkWidget is the storage type for widgets */
+ GtkWidget *window;
+ GtkWidget *button;
+
+ /* This is called in all GTK applications. Arguments are parsed
+ * from the command line and are returned to the application. */
+ gtk_init (&argc, &argv);
+
+ /* create a new window */
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ /* When the window is given the "delete_event" signal (this is given
+ * by the window manager, usually by the "close" option, or on the
+ * titlebar), we ask it to call the delete_event () function
+ * as defined above. The data passed to the callback
+ * function is NULL and is ignored in the callback function. */
+ g_signal_connect (G_OBJECT (window), "delete_event",
+ G_CALLBACK (delete_event), NULL);
+
+ /* Here we connect the "destroy" event to a signal handler.
+ * This event occurs when we call gtk_widget_destroy() on the window,
+ * or if we return FALSE in the "delete_event" callback. */
+ g_signal_connect (G_OBJECT (window), "destroy",
+ G_CALLBACK (destroy), NULL);
+
+ /* Sets the border width of the window. */
+ gtk_container_set_border_width (GTK_CONTAINER (window), 10);
+
+ /* Creates a new button with the label "Hello World". */
+ button = gtk_button_new_with_label ("Hello World");
+
+ /* When the button receives the "clicked" signal, it will call the
+ * function hello() passing it NULL as its argument. The hello()
+ * function is defined above. */
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (hello), NULL);
+
+ /* This will cause the window to be destroyed by calling
+ * gtk_widget_destroy(window) when "clicked". Again, the destroy
+ * signal could come from here, or the window manager. */
+ g_signal_connect_swapped (G_OBJECT (button), "clicked",
+ G_CALLBACK (gtk_widget_destroy),
+ G_OBJECT (window));
+
+ /* This packs the button into the window (a gtk container). */
+ gtk_container_add (GTK_CONTAINER (window), button);
+
+ /* The final step is to display this newly created widget. */
+ gtk_widget_show (button);
+
+ /* and the window */
+ gtk_widget_show (window);
+
+ /* All GTK applications must have a gtk_main(). Control ends here
+ * and waits for an event to occur (like a key press or
+ * mouse event). */
+ gtk_main ();
+
+ return 0;
+}
@@ -0,0 +1,32 @@
+%%%-------------------------------------------------------------------
+%%% File : hello.erl
+%%% Author : Mats Cronqvist <locmacr@mwlx084>
+%%% Description :
+%%%
+%%% Created : 27 Nov 2006 by Mats Cronqvist <locmacr@mwlx084>
+%%%-------------------------------------------------------------------
+-module(hello).
+
+-export([go/0]).
+
+-define(G(C,A),gtknode:cmd(hello,C,A)).
+
+go() ->
+ gtknode:start(hello),
+ Win = ?G('Gtk_window_new',['GTK_WINDOW_TOPLEVEL']),
+ But = ?G('Gtk_button_new_with_label',["butt"]),
+ ?G('Gtk_container_add',[Win,But]),
+ ?G('Gtk_widget_show',[Win]),
+ ?G('Gtk_widget_show',[But]),
+ ?G('GN_signal_connect',[But,clicked]),
+ ?G('GN_signal_connect',[Win,destroy]),
+ loop(Win,But).
+
+loop(Win,But) ->
+ receive
+ {hello,{signal,{But,clicked}}} ->
+ io:fwrite("~p~n",[clicked]),
+ loop(Win,But);
+ {hello,{signal,{Win,destroy}}} ->
+ gtknode:stop(hello)
+ end.
View
@@ -32,11 +32,20 @@ start(Name) ->
started -> Pid;
quit -> ok
end;
- _ -> erlang:fault({already_started,Name})
+ _ ->
+ {already_started,Name}
end.
-stop(Pid) ->
- Pid ! quit.
+stop(Pid) when is_pid(Pid) ->
+ case is_process_alive(Pid) of
+ true -> Pid ! quit;
+ false -> {not_running,Pid}
+ end;
+stop(Name) when is_atom(Name) ->
+ case whereis(Name) of
+ undefined -> {not_running,Name};
+ Pid -> stop(Pid)
+ end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% for debugging, run gtknode:debug and start gtknode from a shell thusly;
@@ -78,14 +87,19 @@ loopDBGH() ->
gtknode_dbg ! {self(),Cmd},loopDBGH()
end.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cmd(GUI,C,As) -> cmd(GUI,[{C,As}]).
cmd(GUI,CAs) ->
GUI ! {self(),CAs},
receive
- {GUI,{reply,Reps}} -> Reps
+ {GUI,{reply,Reps}} -> filter_reps(Reps,CAs)
end.
+filter_reps([{ok,Rep}],[_]) -> Rep;
+filter_reps([{ok,_}|Reps],[_|CAs]) -> filter_reps(Reps,CAs);
+filter_reps([{error,R}|_],[CA|_]) -> exit({gtknode_error,{R,CA}}).
+
%%%-------------------------------------------------------------------
%%% implements the gtkNode middleman process
%%% links to the gtkNode and to the signal handler
@@ -207,6 +221,7 @@ bored(State,St) ->
?LOG([{bored,State}, {state,St}, {msgs,process_info(self(),messages)}]),
St.
+die(quitting) -> ok;
die(Reason) ->
process_flag(trap_exit,false),
exit({dying,Reason}).

0 comments on commit 76e05b9

Please sign in to comment.