Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pango: Backport Language changes #846

Merged
merged 5 commits into from Dec 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion cairo/Cargo.toml
Expand Up @@ -6,7 +6,7 @@ authors = ["The gtk-rs Project Developers"]
keywords = ["cairo", "gtk-rs", "gnome", "GUI"]
readme = "README.md"
documentation = "https://gtk-rs.org/gtk-rs-core/stable/latest/docs/cairo/"
version = "0.16.4"
version = "0.16.5"
description = "Rust bindings for the Cairo library"
repository = "https://github.com/gtk-rs/gtk-rs-core"
edition = "2021"
Expand Down
2 changes: 1 addition & 1 deletion cairo/sys/Cargo.toml
Expand Up @@ -4,7 +4,7 @@ license = "MIT"
authors = ["The gtk-rs Project Developers"]
homepage = "https://gtk-rs.org/"
description = "FFI bindings to libcairo"
version = "0.16.4"
version = "0.16.5"
keywords = ["cairo", "ffi", "gtk-rs", "gnome"]
repository = "https://github.com/gtk-rs/gtk-rs-core"
build = "build.rs"
Expand Down
2 changes: 1 addition & 1 deletion gdk-pixbuf/Cargo.toml
Expand Up @@ -6,7 +6,7 @@ authors = ["The gtk-rs Project Developers"]
keywords = ["gdk-pixbuf", "gtk-rs", "gnome"]
readme = "README.md"
documentation = "https://gtk-rs.org/gtk-rs-core/stable/latest/docs/gdk_pixbuf/"
version = "0.16.4"
version = "0.16.5"
description = "Rust bindings for the GdkPixbuf library"
repository = "https://github.com/gtk-rs/gtk-rs-core"
exclude = [
Expand Down
2 changes: 1 addition & 1 deletion gdk-pixbuf/sys/Cargo.toml
Expand Up @@ -40,7 +40,7 @@ keywords = ["gdk-pixbuf", "ffi", "gtk-rs", "gnome"]
license = "MIT"
name = "gdk-pixbuf-sys"
repository = "https://github.com/gtk-rs/gtk-rs-core"
version = "0.16.4"
version = "0.16.5"
edition = "2021"
rust-version = "1.63"
[package.metadata.docs.rs]
Expand Down
2 changes: 1 addition & 1 deletion gio/Cargo.toml
Expand Up @@ -6,7 +6,7 @@ authors = ["The gtk-rs Project Developers"]
keywords = ["glib", "gio", "gtk-rs", "gnome"]
readme = "README.md"
documentation = "https://gtk-rs.org/gtk-rs-core/stable/latest/docs/gio/"
version = "0.16.4"
version = "0.16.5"
description = "Rust bindings for the Gio library"
repository = "https://github.com/gtk-rs/gtk-rs-core"
exclude = [
Expand Down
2 changes: 1 addition & 1 deletion gio/sys/Cargo.toml
Expand Up @@ -45,7 +45,7 @@ keywords = ["gio", "ffi", "gtk-rs", "gnome"]
license = "MIT"
name = "gio-sys"
repository = "https://github.com/gtk-rs/gtk-rs-core"
version = "0.16.4"
version = "0.16.5"
edition = "2021"
rust-version = "1.63"
[package.metadata.docs.rs]
Expand Down
2 changes: 1 addition & 1 deletion glib-build-tools/Cargo.toml
Expand Up @@ -6,7 +6,7 @@ authors = ["The gtk-rs Project Developers"]
keywords = ["glib", "gio", "gtk-rs", "gnome", "build-dependencies"]
readme = "README.md"
documentation = "https://gtk-rs.org/gtk-rs-core/stable/latest/docs/glib-build-tools"
version = "0.16.4"
version = "0.16.5"
description = "Rust bindings for the Gio library, build script utils crate"
repository = "https://github.com/gtk-rs/gtk-rs-core"
edition = "2021"
Expand Down
2 changes: 1 addition & 1 deletion glib-macros/Cargo.toml
Expand Up @@ -4,7 +4,7 @@ documentation = "https://gtk-rs.org/gtk-rs-core/stable/latest/docs/glib_macros/"
homepage = "https://gtk-rs.org/"
authors = ["The gtk-rs Project Developers"]
description = "Rust bindings for the GLib library, proc macros crate"
version = "0.16.4"
version = "0.16.5"
keywords = ["glib", "gtk-rs", "gnome", "GUI"]
repository = "https://github.com/gtk-rs/gtk-rs-core"
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion glib/Cargo.toml
Expand Up @@ -5,7 +5,7 @@ homepage = "https://gtk-rs.org/"
authors = ["The gtk-rs Project Developers"]
description = "Rust bindings for the GLib library"
readme = "README.md"
version = "0.16.4"
version = "0.16.5"
keywords = ["glib", "gtk-rs", "gnome", "GUI"]
repository = "https://github.com/gtk-rs/gtk-rs-core"
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion glib/gobject-sys/Cargo.toml
Expand Up @@ -35,7 +35,7 @@ keywords = ["gobject", "ffi", "gtk-rs", "gnome"]
license = "MIT"
name = "gobject-sys"
repository = "https://github.com/gtk-rs/gtk-rs-core"
version = "0.16.4"
version = "0.16.5"
edition = "2021"
rust-version = "1.63"
[package.metadata.docs.rs]
Expand Down
4 changes: 2 additions & 2 deletions glib/src/lib.rs
Expand Up @@ -29,8 +29,8 @@ pub use self::bytes::Bytes;
pub use self::closure::{Closure, RustClosure};
pub use self::error::{BoolError, Error};
pub use self::object::{
BorrowedObject, Cast, Class, InitiallyUnowned, Interface, IsA, Object, ObjectExt, ObjectType,
SendWeakRef, WeakRef,
BorrowedObject, Cast, CastNone, Class, InitiallyUnowned, Interface, IsA, Object, ObjectExt,
ObjectType, SendWeakRef, WeakRef,
};
pub use self::signal::{
signal_handler_block, signal_handler_disconnect, signal_handler_unblock,
Expand Down
73 changes: 73 additions & 0 deletions glib/src/object.rs
Expand Up @@ -288,6 +288,79 @@ pub trait Cast: ObjectType {

impl<T: ObjectType> Cast for T {}

// rustdoc-stripper-ignore-next
/// Convenience trait mirroring `Cast`, implemented on `Option<Object>` types.
///
/// # Warning
/// Inveitably this trait will discard informations about a downcast failure:
/// you don't know if the object was not of the expected type, or if it was `None`.
/// If you need to handle the downcast error, use `Cast` over a `glib::Object`.
///
/// # Example
/// ```ignore
/// let widget: Option<Widget> = list_item.child();
///
/// // Without using `CastNone`
/// let label = widget.unwrap().downcast::<gtk::Label>().unwrap();
///
/// // Using `CastNone` we can avoid the first `unwrap()` call
/// let label = widget.and_downcast::<gtk::Label>().unwrap();
/// ````
pub trait CastNone: Sized {
type Inner;
fn and_downcast<T: ObjectType>(self) -> Option<T>
where
Self::Inner: CanDowncast<T>;
fn and_downcast_ref<T: ObjectType>(&self) -> Option<&T>
where
Self::Inner: CanDowncast<T>;
fn and_upcast<T: ObjectType>(self) -> Option<T>
where
Self::Inner: IsA<T>;
fn and_upcast_ref<T: ObjectType>(&self) -> Option<&T>
where
Self::Inner: IsA<T>;
fn and_dynamic_cast<T: ObjectType>(self) -> Result<T, Self>;
fn and_dynamic_cast_ref<T: ObjectType>(&self) -> Option<&T>;
}
impl<I: ObjectType + Sized> CastNone for Option<I> {
type Inner = I;

fn and_downcast<T: ObjectType>(self) -> Option<T>
where
Self::Inner: CanDowncast<T>,
{
self.and_then(|i| i.downcast().ok())
}

fn and_downcast_ref<T: ObjectType>(&self) -> Option<&T>
where
Self::Inner: CanDowncast<T>,
{
self.as_ref().and_then(|i| i.downcast_ref())
}
fn and_upcast<T: ObjectType>(self) -> Option<T>
where
Self::Inner: IsA<T>,
{
self.map(|i| i.upcast())
}

fn and_upcast_ref<T: ObjectType>(&self) -> Option<&T>
where
Self::Inner: IsA<T>,
{
self.as_ref().map(|i| i.upcast_ref())
}
fn and_dynamic_cast<T: ObjectType>(self) -> Result<T, Self> {
self.ok_or(None)
.and_then(|i| i.dynamic_cast().map_err(|e| Some(e)))
}
fn and_dynamic_cast_ref<T: ObjectType>(&self) -> Option<&T> {
self.as_ref().and_then(|i| i.dynamic_cast_ref())
}
}

// rustdoc-stripper-ignore-next
/// Marker trait for the statically known possibility of downcasting from `Self` to `T`.
pub trait CanDowncast<T> {}
Expand Down
2 changes: 1 addition & 1 deletion glib/src/prelude.rs
Expand Up @@ -5,6 +5,6 @@

pub use crate::param_spec::ParamSpecBuilderExt;
pub use crate::{
Cast, Continue, IsA, ObjectExt, ObjectType, ParamSpecType, StaticType, StaticTypeExt,
Cast, CastNone, Continue, IsA, ObjectExt, ObjectType, ParamSpecType, StaticType, StaticTypeExt,
StaticVariantType, ToSendValue, ToValue, ToVariant,
};
2 changes: 1 addition & 1 deletion glib/sys/Cargo.toml
Expand Up @@ -32,7 +32,7 @@ keywords = ["glib", "ffi", "gtk-rs", "gnome"]
license = "MIT"
name = "glib-sys"
repository = "https://github.com/gtk-rs/gtk-rs-core"
version = "0.16.4"
version = "0.16.5"
edition = "2021"
rust-version = "1.63"
[package.metadata.docs.rs]
Expand Down
2 changes: 1 addition & 1 deletion graphene/Cargo.toml
Expand Up @@ -6,7 +6,7 @@ authors = ["The gtk-rs Project Developers"]
keywords = ["graphene", "graphene-rs", "gtk-rs", "gnome", "GUI"]
readme = "README.md"
documentation = "https://gtk-rs.org/gtk-rs-core/stable/latest/docs/graphene/"
version = "0.16.4"
version = "0.16.5"
description = "Rust bindings for the Graphene library"
repository = "https://github.com/gtk-rs/gtk-rs-core"
exclude = [
Expand Down
2 changes: 1 addition & 1 deletion graphene/sys/Cargo.toml
Expand Up @@ -29,7 +29,7 @@ keywords = ["graphene", "ffi", "gtk-rs", "gnome"]
license = "MIT"
name = "graphene-sys"
repository = "https://github.com/gtk-rs/gtk-rs-core"
version = "0.16.4"
version = "0.16.5"
edition = "2021"
rust-version = "1.63"
[package.metadata.docs.rs]
Expand Down
2 changes: 1 addition & 1 deletion pango/Cargo.toml
Expand Up @@ -5,7 +5,7 @@ homepage = "https://gtk-rs.org/"
authors = ["The gtk-rs Project Developers"]
keywords = ["pango", "gtk-rs", "gnome"]
readme = "README.md"
version = "0.16.4"
version = "0.16.5"
description = "Rust bindings for the Pango library"
repository = "https://github.com/gtk-rs/gtk-rs-core"
license = "MIT"
Expand Down
21 changes: 20 additions & 1 deletion pango/Gir.toml
Expand Up @@ -69,7 +69,6 @@ manual = [
"Pango.Coverage",
"Pango.GlyphGeometry",
"Pango.GlyphInfo",
"Pango.Language",
"Pango.LayoutDeserializeError",
"Pango.Rectangle",
]
Expand Down Expand Up @@ -332,6 +331,26 @@ concurrency = "send+sync"
name = "glyphs"
const = true

[[object]]
name = "Pango.Language"
status = "generate"
[[object.function]]
pattern = "get_(scripts|preferred)"
manual = true # probably needs annotation fixes upstream (array zero-terminated=1)
[[object.function]]
pattern = "(get_sample_string|includes_script|matches|to_string)"
[[object.function.parameter]]
name = "language"
const = true
[[object.function]]
name = "from_string"
# This only returns NULL when passing NULL
[[object.function.parameter]]
name = "language"
nullable = false
[object.function.return]
nullable = false

[[object]]
name = "Pango.Layout"
status = "generate"
Expand Down
6 changes: 5 additions & 1 deletion pango/src/attr_language.rs
Expand Up @@ -8,7 +8,11 @@ define_attribute_struct!(AttrLanguage, ffi::PangoAttrLanguage, &[AttrType::Langu
impl AttrLanguage {
#[doc(alias = "pango_attr_language_new")]
pub fn new(language: &Language) -> Self {
unsafe { from_glib_full(ffi::pango_attr_language_new(language.to_glib_none().0)) }
unsafe {
from_glib_full(ffi::pango_attr_language_new(mut_override(
language.to_glib_none().0,
)))
}
}

pub fn value(&self) -> Language {
Expand Down
79 changes: 79 additions & 0 deletions pango/src/auto/language.rs
@@ -0,0 +1,79 @@
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT

use crate::Script;
use glib::translate::*;
use std::fmt;

glib::wrapper! {
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Language(Boxed<ffi::PangoLanguage>);

match fn {
copy => |ptr| glib::gobject_ffi::g_boxed_copy(ffi::pango_language_get_type(), ptr as *mut _) as *mut ffi::PangoLanguage,
free => |ptr| glib::gobject_ffi::g_boxed_free(ffi::pango_language_get_type(), ptr as *mut _),
type_ => || ffi::pango_language_get_type(),
}
}

impl Language {
#[doc(alias = "pango_language_get_sample_string")]
#[doc(alias = "get_sample_string")]
pub fn sample_string(&self) -> glib::GString {
unsafe {
from_glib_none(ffi::pango_language_get_sample_string(mut_override(
self.to_glib_none().0,
)))
}
}

#[doc(alias = "pango_language_includes_script")]
pub fn includes_script(&self, script: Script) -> bool {
unsafe {
from_glib(ffi::pango_language_includes_script(
mut_override(self.to_glib_none().0),
script.into_glib(),
))
}
}

#[doc(alias = "pango_language_matches")]
pub fn matches(&self, range_list: &str) -> bool {
unsafe {
from_glib(ffi::pango_language_matches(
mut_override(self.to_glib_none().0),
range_list.to_glib_none().0,
))
}
}

#[doc(alias = "pango_language_to_string")]
#[doc(alias = "to_string")]
pub fn to_str(&self) -> glib::GString {
unsafe {
from_glib_none(ffi::pango_language_to_string(mut_override(
self.to_glib_none().0,
)))
}
}

#[doc(alias = "pango_language_from_string")]
pub fn from_string(language: &str) -> Language {
unsafe { from_glib_none(ffi::pango_language_from_string(language.to_glib_none().0)) }
}

#[doc(alias = "pango_language_get_default")]
#[doc(alias = "get_default")]
#[allow(clippy::should_implement_trait)]
pub fn default() -> Language {
unsafe { from_glib_none(ffi::pango_language_get_default()) }
}
}

impl fmt::Display for Language {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(&self.to_str())
}
}
3 changes: 3 additions & 0 deletions pango/src/auto/mod.rs
Expand Up @@ -53,6 +53,9 @@ pub use self::glyph_string::GlyphString;
mod item;
pub use self::item::Item;

mod language;
pub use self::language::Language;

mod layout_iter;
pub use self::layout_iter::LayoutIter;

Expand Down