diff --git a/src/GLib/gtype.jl b/src/GLib/gtype.jl index ab0bd20b..4aa931b1 100644 --- a/src/GLib/gtype.jl +++ b/src/GLib/gtype.jl @@ -15,6 +15,8 @@ immutable GParamSpec owner_type::GType end +GVariant = Void + const fundamental_types = ( #(:name, Ctype, JuliaType, g_value_fn) (:invalid, Void, Void, :error), @@ -38,7 +40,7 @@ const fundamental_types = ( (:GBoxed, Ptr{GBoxed}, GBoxed, :boxed), (:GParam, Ptr{GParamSpec}, Ptr{GParamSpec},:param), (:GObject, Ptr{GObject}, GObject, :object), - #(:GVariant, Ptr{GVariant}, GVariant, :variant), + (:GVariant, Ptr{GVariant}, GVariant, :variant), ) # NOTE: in general do not cache ids, except for these fundamental values g_type_from_name(name::Symbol) = ccall((:g_type_from_name,libgobject),GType,(Ptr{Uint8},),name) diff --git a/src/application.jl b/src/application.jl index 114a6ef1..8be57126 100644 --- a/src/application.jl +++ b/src/application.jl @@ -1,4 +1,35 @@ if gtk_version == 3 + +@Giface GAction Gtk.libgio g_action +@Giface GActionGroup Gtk.libgio g_action_group + +### GActionMap ### + +@Giface GActionMap Gtk.libgio g_action_map + +push!(action_map::GActionMap, action::GAction) = + ccall((:g_action_map_add_action, libgio), Void, (Ptr{GObject}, Ptr{GObject}), action_map, action) + +splice!(action_map::GActionMap, action_name::String) = + ccall((:g_action_map_remove_action, libgio), Void, (Ptr{GObject}, Ptr{Uint8}), action_map, bytestring(action_name)) + +lookup(action_map::GActionMap, action_name::String) = + ccall((:g_action_map_lookup_action, libgio), Ptr{GObject}, (Ptr{GObject}, Ptr{Uint8}), action_map, bytestring(action_name)) + +### GApplication + +@Gtype GApplication Gtk.libgio g_application + +### GSimpleAction ### + +@Gtype GSimpleAction Gtk.libgio g_simple_action +GSimpleActionLeaf(name::String) = GSimpleActionLeaf( + ccall((:g_simple_action_new, libgio), Ptr{GObject}, (Ptr{Uint8}, Ptr{Void}), bytestring(name), C_NULL) ) + + + +### GtkApplication ### + @gtktype GtkApplication GtkApplicationLeaf(id::String, flags) = GtkApplicationLeaf( ccall((:gtk_application_new, libgtk), Ptr{GObject}, (Ptr{Uint8}, Cuint), bytestring(id), flags) ) @@ -13,12 +44,31 @@ function splice!(app::GtkApplication, win::GtkWindow) app end -app_menu(app::GtkApplication, app_menu::GObject) = - ccall((:gtk_application_new, libgtk), Void, (Ptr{GObject}, Ptr{GObject}), app, app_menu) +add_accelerator(app::GtkApplication, accelerator::String, action_name::String, parameter=C_NULL) = + ccall((:gtk_application_add_accelerator, libgtk), Void, (Ptr{GObject}, Ptr{Uint8}, Ptr{Uint8}, Ptr{Uint8}), + app, bytestring(accelerator), bytestring(action_name), parameter) + + +remove_accelerator(app::GtkApplication, action_name::String, parameter=C_NULL) = + ccall((:gtk_application_remove_accelerator, libgtk), Void, (Ptr{GObject}, Ptr{Uint8}, Ptr{Uint8}), + bytestring(action_name), parameter) + +set_menubar(app::GtkApplication, menubar::GObject) = + ccall((:gtk_application_set_menubar, libgtk), Void, (Ptr{GObject}, Ptr{GObject}), app, menubar) + +set_app_menu(app::GtkApplication, app_menu::GObject) = + ccall((:gtk_application_set_app_menu, libgtk), Void, (Ptr{GObject}, Ptr{GObject}), app, app_menu) + +run(app::GtkApplication) = + ccall((:g_application_run, libgio), Cint, (Ptr{GObject}, Cint, Ptr{Uint8}), app, 0, C_NULL) + +### GtkApplicationWindow ### @gtktype GtkApplicationWindow GtkApplicationWindowLeaf(app::GtkApplication) = GtkApplicationWindowLeaf( ccall((:gtk_application_window_new, libgtk), Ptr{GObject}, (Ptr{GObject},), app) ) + + else type GtkApplication end type GtkApplicationWindow end diff --git a/src/events.jl b/src/events.jl index a1998153..c1e01685 100644 --- a/src/events.jl +++ b/src/events.jl @@ -17,9 +17,9 @@ function __init__() # if g_main_depth > 0, a glib main-loop is already running, # so we don't need to start a new one - if ccall((:g_main_depth,GLib.libglib),Cint,()) == 0 - global gtk_main_task = @schedule gtk_main() - end + #if ccall((:g_main_depth,GLib.libglib),Cint,()) == 0 + # global gtk_main_task = @schedule gtk_main() + #end end diff --git a/src/lists.jl b/src/lists.jl index 1ae58839..ecf250d6 100644 --- a/src/lists.jl +++ b/src/lists.jl @@ -439,7 +439,8 @@ function selected(selection::GtkTreeSelection) if !ret error("No selection of GtkTreeSelection") end - convert(GtkTreeModel, model[]), iter[] + #convert(GtkTreeModel, model[]), iter[] + model[], iter[] end length(selection::GtkTreeSelection) = diff --git a/test/gtkapplication_tests.jl b/test/gtkapplication_tests.jl new file mode 100644 index 00000000..767194c1 --- /dev/null +++ b/test/gtkapplication_tests.jl @@ -0,0 +1,68 @@ +using Gtk, Gtk.ShortNames, Gtk.GConstants + +app = @GtkApplication("org.julia.example", GApplicationFlags.FLAGS_NONE) + +const builderstr = + """ + + + File + + Quit + app.quit + + + + Help + + + +
+ + New + app.new + + + Quit + app.quit + +
+
+
""" + +signal_connect(app,"activate") do a, args... + w = Gtk.@GtkApplicationWindow(a) + G_.title(w, "GtkApplication Test App" ) + G_.default_size(w, 400,400) + builder = @GtkBuilder(buffer=builderstr) + + menubar = G_.object(builder,"menubar") + appmenu = G_.object(builder,"appmenu") + + Gtk.set_menubar(app, menubar) + Gtk.set_app_menu(app, appmenu) + + ls=@ListStore(Int32,Bool) + push!(ls,(33,true)) + tv=@TreeView(TreeModel(ls)) + r1=@CellRendererText() + r2=@CellRendererToggle() + c1=@TreeViewColumn("A", r1,{"text" => 0}) + c2=@TreeViewColumn("B", r2,{"active" => 1}) + push!(tv,c1) + push!(tv,c2) + push!(w, tv) + + quitAction = Gtk.@GSimpleAction("quit") + signal_connect(quitAction, :activate) do widget... + exit() + end + push!( Gtk.GActionMap(a), Gtk.GAction(quitAction) ) + + Gtk.add_accelerator(a, "q", "app.quit") + + showall(w) +end + +Gtk.run(app) # enters main loop +