From 40565e38ecd8239cc64aa35215ecb84a32bad9f7 Mon Sep 17 00:00:00 2001 From: Jonathan Bieler Date: Fri, 5 Feb 2021 15:27:46 +0100 Subject: [PATCH] Added miscellaneous text and window related bindings --- src/gdk.jl | 10 +++++++++ src/lists.jl | 36 ++++++++++++++++++++++++++---- src/text.jl | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/theme.jl | 32 +++++++++++++++++++++----- 4 files changed, 132 insertions(+), 9 deletions(-) diff --git a/src/gdk.jl b/src/gdk.jl index 5aba1868..43c4a287 100644 --- a/src/gdk.jl +++ b/src/gdk.jl @@ -196,3 +196,13 @@ function screen_size(screen::Ptr{Nothing}) return (ccall((:gdk_screen_get_width, libgdk), Cint, (Ptr{Nothing},), screen), ccall((:gdk_screen_get_height, libgdk), Cint, (Ptr{Nothing},), screen)) end + +function get_origin(window) + window_x, window_y = mutable(Cint), mutable(Cint) + ccall( + (:gdk_window_get_origin, libgdk), Cint, + (Ptr{GObject}, Ptr{Cint}, Ptr{Cint}), + window, window_x, window_y + ) + return (window_x[], window_y[]) +end \ No newline at end of file diff --git a/src/lists.jl b/src/lists.jl index 5f6025c7..5a0108d9 100644 --- a/src/lists.jl +++ b/src/lists.jl @@ -443,13 +443,14 @@ function iter_n_children(treeModel::GtkTreeModel, iter::TRI) ret end - ## update iter pointing to nth child n in 1:nchildren) +## As a special case, if parent is NULL, then the n-th root node is set ## return boolean -function iter_nth_child(treeModel::GtkTreeModel, iter::Mutable{GtkTreeIter}, piter::TRI, n::Int) +function iter_nth_child(treeModel::GtkTreeModel, iter::Mutable{GtkTreeIter}, parent_iter::Union{TRI, Nothing}, n::Int) + parent_iter = isnothing(parent_iter) ? C_NULL : mutable(parent_iter) ret = ccall((:gtk_tree_model_iter_nth_child, libgtk), Cint, (Ptr{GObject}, Ptr{GtkTreeIter}, Ptr{GtkTreeIter}, Cint), - treeModel, iter, mutable(piter), n - 1) # 0-based + treeModel, iter, parent_iter, n - 1) # 0-based ret != 0 end @@ -699,10 +700,12 @@ function push!(treeView::GtkTreeView, treeColumns::GtkTreeViewColumn...) end treeView end + function insert!(treeView::GtkTreeView, index::Integer, treeColumn::GtkTreeViewColumn) ccall((:gtk_tree_view_insert_column, libgtk), Nothing, (Ptr{GObject}, Ptr{GObject}, Cint), treeView, treeColumn, index - 1) treeView end + function delete!(treeView::GtkTreeView, treeColumns::GtkTreeViewColumn...) for col in treeColumns ccall((:gtk_tree_view_remove_column, libgtk), Nothing, (Ptr{GObject}, Ptr{GObject}), treeView, col) @@ -710,6 +713,31 @@ function delete!(treeView::GtkTreeView, treeColumns::GtkTreeViewColumn...) treeView end +function expand_to_path(tree_view::GtkTreeView, path::GtkTreePath) + return ccall( + (:gtk_tree_view_expand_to_path, libgtk), Cvoid, + (Ptr{GObject}, Ptr{GtkTreePath}), tree_view, path + ) +end + +function treepath(path::AbstractString) + ptr = ccall( + (:gtk_tree_path_new_from_string, libgtk), Ptr{GtkTreePath}, + (Ptr{UInt8},), bytestring(path) + ) + return ptr == C_NULL ? GtkTreePath() : convert(GtkTreePath, ptr) +end + +# There's a method wrapped in GAccessor but tries to convert to a GtkTreeModel, which +# is an interface in Gtk +function model(tree_view::GtkTreeView) + return convert(GtkTreeStore, ccall( + (:gtk_tree_view_get_model, Gtk.libgtk), + Ptr{Gtk.GObject}, + (Ptr{Gtk.GObject},), + tree_view) + ) +end # TODO Use internal accessor with default values? function path_at_pos(treeView::GtkTreeView, x::Integer, y::Integer) @@ -721,7 +749,7 @@ function path_at_pos(treeView::GtkTreeView, x::Integer, y::Integer) if ret path = GtkTreePath(pathPtr[], true) else - path = GtkTreePath() + path = GtkTreePath() end ret, path end diff --git a/src/text.jl b/src/text.jl index 1854f40e..2bdb3979 100644 --- a/src/text.jl +++ b/src/text.jl @@ -689,6 +689,69 @@ function scroll_to(view::GtkTextView, iter::TI, within_margin::Real, view, iter, within_margin, use_align, xalign, yalign) end + +""" + buffer_to_window_coords(view::GtkTextView, buffer_x::Integer, buffer_y::Integer, wintype::Integer = 0) + +Implements `gtk_text_view_buffer_to_window_coords`. +""" +function buffer_to_window_coords(view::GtkTextView, buffer_x::Integer, buffer_y::Integer, wintype::Integer = 0) + window_x, window_y = Gtk.mutable(Cint), Gtk.mutable(Cint) + ccall( + (:gtk_text_view_buffer_to_window_coords, libgtk), Cvoid, + (Ptr{Gtk.GObject}, Cint, Cint, Cint, Ptr{Cint}, Ptr{Cint}), + view, Int32(wintype), buffer_x, buffer_y, window_x, window_y + ) + return (window_x[], window_y[]) +end + +""" + window_to_buffer_coords(view::Gtk.GtkTextView, window_x::Integer, window_y::Integer, wintype::Integer = 2) + +Implements `gtk_text_view_window_to_buffer_coords`. +""" +function window_to_buffer_coords(view::GtkTextView, window_x::Integer, window_y::Integer, wintype::Integer = 2) + buffer_x, buffer_y = Gtk.mutable(Cint), Gtk.mutable(Cint) + ccall( + (:gtk_text_view_window_to_buffer_coords, libgtk), Cvoid, + (Ptr{GObject}, Cint, Cint, Cint, Ptr{Cint}, Ptr{Cint}), + view, Int32(wintype), window_x, window_y, buffer_x, buffer_y + ) + return (buffer_x[],buffer_y[]) +end + +""" + text_iter_at_position(view::GtkTextView, x::Integer, y::Integer) + +Implements `gtk_text_view_get_iter_at_position`. +""" +function text_iter_at_position(view::GtkTextView, x::Integer, y::Integer) + buffer = view.buffer[GtkTextBuffer] + iter = mutable(GtkTextIter(buffer)) + text_iter_at_position(view, iter, C_NULL, Int32(x), Int32(y)) + return GtkTextIter(buffer, char_offset(iter)) +end + +text_iter_at_position(view::GtkTextView, iter::Mutable{GtkTextIter}, trailing, x::Int32, y::Int32) = ccall( + (:gtk_text_view_get_iter_at_position, libgtk), Cvoid, + (Ptr{GObject}, Ptr{GtkTextIter}, Ptr{Cint}, Cint, Cint), + view, iter, trailing, x, y +) + +function cursor_locations(view::GtkTextView) + weak = Gtk.mutable(GdkRectangle) + strong = Gtk.mutable(GdkRectangle) + buffer = view.buffer[GtkTextBuffer] + iter = mutable(GtkTextIter(buffer, buffer.cursor_position[Int])) + + ccall( + (:gtk_text_view_get_cursor_locations, libgtk), Cvoid, + (Ptr{GObject}, Ptr{GtkTextIter}, Ptr{Gtk.GdkRectangle}, Ptr{GdkRectangle}), + view, iter, strong, weak + ) + return (iter, strong[], weak[]) +end + #### GtkTextMark #### visible(w::GtkTextMark) = diff --git a/src/theme.jl b/src/theme.jl index 07a54ab1..ba886270 100644 --- a/src/theme.jl +++ b/src/theme.jl @@ -6,13 +6,13 @@ function GtkCssProviderLeaf(; data = nothing, filename = nothing) provider = GtkCssProviderLeaf(ccall((:gtk_css_provider_new, libgtk), Ptr{GObject}, ())) if data !== nothing GError() do error_check - ccall((:gtk_css_provider_load_from_data, libgtk), Bool, + ccall((:gtk_css_provider_load_from_data, libgtk), Bool, (Ptr{GObject}, Ptr{UInt8}, Clong, Ptr{Ptr{GError}}), provider, bytestring(data), -1, error_check) end elseif filename !== nothing GError() do error_check - ccall((:gtk_css_provider_load_from_path, libgtk), Bool, + ccall((:gtk_css_provider_load_from_path, libgtk), Bool, (Ptr{GObject}, Ptr{UInt8}, Ptr{Ptr{GError}}), provider, bytestring(filename), error_check) end @@ -22,6 +22,28 @@ end GtkStyleContextLeaf() = GtkStyleContextLeaf(ccall((:gtk_style_context_new, libgtk), Ptr{GObject}, ())) -push!(context::GtkStyleContext, provider::GObject, priority::Integer) = - ccall((:gtk_style_context_add_provider, libgtk), Nothing, (Ptr{GObject}, Ptr{GObject}, Cuint), - context, provider, priority) +push!(context::GtkStyleContext, provider::GObject, priority::Integer) = ccall( + (:gtk_style_context_add_provider, libgtk), Nothing, (Ptr{GObject}, Ptr{GObject}, Cuint), + context, provider, priority +) + +icon_theme_get_default() = ccall((:gtk_icon_theme_get_default, Gtk.libgtk), Ptr{GObject}, ()) + +icon_theme_append_search_path(icon_theme, path::AbstractString) = ccall( + (:gtk_icon_theme_append_search_path, libgtk), Cvoid, (Ptr{GObject}, Ptr{UInt8}), + icon_theme, path +) + +function icon_theme_load_icon_for_scale(icon_theme, icon_name::AbstractString, size::Integer, scale::Integer, flags::Integer) + local pixbuf::Ptr{GObject} + Gtk.GError() do error_check + pixbuf = ccall( + (:gtk_icon_theme_load_icon_for_scale, libgtk), + Ptr{GObject}, + (Ptr{GObject}, Ptr{UInt8}, Cint, Cint, Cint, Ptr{Ptr{GError}}), + icon_theme, bytestring(icon_name), size, scale, flags, error_check + ) + return pixbuf !== C_NULL + end + return convert(GdkPixbuf, pixbuf) +end \ No newline at end of file