Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
new gtknode:cmd
  added "hello" example


git-svn-id: https://gtknode.googlecode.com/svn/trunk@26 9999ab98-4a1b-0410-ba6a-d90168ca9a37
  • Loading branch information
massemanet committed Nov 27, 2006
1 parent 12b280a commit 76e05b9
Show file tree
Hide file tree
Showing 8 changed files with 165 additions and 9 deletions.
3 changes: 0 additions & 3 deletions c_src/gtknode_glade.c
Expand Up @@ -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){
Expand Down
1 change: 0 additions & 1 deletion c_src/gtknode_marshal.c
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions configure.ac
Expand Up @@ -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 \
])
Expand Down
2 changes: 1 addition & 1 deletion priv/examples/Makefile.am
@@ -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)
Expand Down
14 changes: 14 additions & 0 deletions priv/examples/hello/Makefile.am
@@ -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) $<
98 changes: 98 additions & 0 deletions priv/examples/hello/hello.c
@@ -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;
}
32 changes: 32 additions & 0 deletions priv/examples/hello/hello.erl
@@ -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.
23 changes: 19 additions & 4 deletions src/gtknode.erl
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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}).
Expand Down

0 comments on commit 76e05b9

Please sign in to comment.