GithubHelp home page GithubHelp logo

servo / core-graphics-rs Goto Github PK

View Code? Open in Web Editor NEW
21.0 21.0 38.0 203 KB

DEPRECATED - CoreGraphics bindings for Rust

Home Page: https://github.com/servo/core-foundation-rs/

License: Other

Rust 100.00%

core-graphics-rs's Introduction

core-graphics-rs

Build Status

core-graphics-rs's People

Contributors

algesten avatar amccreight avatar brson avatar daniel-abramov avatar eijebong avatar faern avatar fkaa avatar frewsxcv avatar glennw avatar gw3583 avatar jdm avatar jrmuizel avatar kmcallister avatar kornelski avatar larsbergstrom avatar lsalzman avatar mbrubeck avatar metajack avatar ms2ger avatar msanders avatar natalyakovalova avatar nox avatar pcwalton avatar pythoneer avatar ratake avatar robertg avatar rthomas avatar simonsapin avatar ssheldon avatar wilsongiese avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

core-graphics-rs's Issues

core-graphics 0.3.2 fails to build on 1.20.0 on OSX

Seeing this after updating to 1.20.0:

...
error: type `private::ffi::CGSRegionObject` is private
  --> /Users/zzz/.cargo/registry/src/github.com-1ecc6299db9ec823/core-graphics-0.3.2/src/private.rs:81:21
   |
81 |             assert!(ffi::CGSSetSurfaceShape(self.context_id,
   |                     ^^^^^^^^^^^^^^^^^^^^^^^

Seems to be impacting data_provider::__CGDataProvider, color_space::__CGColorSpace and private::ffi::CGSRegionObject.

rustup show:

active toolchain
----------------

stable-x86_64-apple-darwin (default)
rustc 1.20.0 (f3d6973f4 2017-08-27)

Let me know if you need any more details, happy to provide it.

Clean up the code

I've noticed several problems when worked with the code:

  1. Some inconsistencies in coding style: the order of use statements varies between files (it would be better to use the same style / order everywhere; one of the possible styles).
  2. When multiple functions/structures/types are imported from the module, both use something::{str1, test, example} and use something::{ str1, test, example } styles are used, it would be nice to stick to one of the versions.
  3. Sometimes the text width is more than 100 characters.
  4. There is a lot of boilerplate code in each module when it comes to TCFType trait implementation. I think it makes sense to use impl_TCFType! macro from core-foundation-sys or something similar.

The crate does not work with MacOS versions below 10.11 anymore.

It isn't possible to link against this crate on older macos versions since version 0.4.1 containing a commit around 1d652dd5db9124aba79e4f6292c3b292ee5403d7 which added a bunch of calls to the CGEvent API. The first symbol that stops working on our CI is CGEventPostToPid (macos 10.11+) but there are probably other missing symbols.

Unfortunately Firefox's WebRender integration needs to compile on macos 10.7.

It would be great to have a cargo feature flag to disable the APIs that are unavailable in 10.7. (Hopefully WebRender does not depend on any of them).

How to use nsview.layer?

I'm trying to animate a Cocoa nsview via its layer. But with no luck. What would it take to make it work?

I'm trying for example to set the opacity of a layer. All the conditions to enable core animation are met.

This code crashes:

let content_view: id = msg_send![nswindow, contentView];
let layer: id = msg_send![content_view, layer];
let transform: CGAffineTransform = msg_send![layer, affineTransform];
msg_send![layer, setAffineTransform:transform];

And this code behaves in a strange way:

let content_view: id = msg_send![nswindow, contentView];
let layer: id = msg_send![content_view, layer];
let opacity: CGFloat = msg_send![layer, opacity];
// opacity is equal to 0.
let opacity: CGFloat = 0.5;
msg_send![layer, setOpacity:opacity];
// view disappear
let opacity: CGFloat = msg_send![layer, opacity];
// opacity is still equal to 0.

Wrong enum declaration for CGEventType

Problem

CGEvent::new_mouse_event is not working

Reason

The values for CGEventType are denoted as

// Mouse events.
    LeftMouseDown = 1 << 1,
    LeftMouseUp = 1 << 2,
    RightMouseDown = 1 << 3,
    RightMouseUp = 1 << 4,
    MouseMoved = 1 << 5,
    LeftMouseDragged = 1 << 6,
    RightMouseDragged = 1 << 7,

etc.

which seems to be wrong. I think the declaration for e.g. NX_MOUSEMOVED was confused with NX_MOUSEMOVEDMASK

If i look at like CGEventCreateMouseEvent from CGEvent.h it takes a CGEventType and CGEventType in CGEventTypes.his declared like this

typedef CF_ENUM(uint32_t, CGEventType) {
  ...
  /* Mouse events. */
  ...
  kCGEventMouseMoved = NX_MOUSEMOVED,
  ...
}

not NX_MOUSEMOVEDMASK

a minimal program shows the effect. If i use 5 for mousemoved โ€“ the value of NX_MOUSEMOVED โ€“ instead of the values that is declared in CGEventType 1<<5 it works

extern crate core_graphics;
extern crate libc;

use self::core_graphics::display::*;
use self::core_graphics::event::*;
use self::core_graphics::geometry::*;
use self::core_graphics::event_source::*;

use std::ptr;
use libc::*;


#[link(name = "ApplicationServices", kind = "framework")]
extern {
    fn CGEventCreateMouseEvent( source: CGEventSourceRef, 
                                mouseType: uint32_t,//mouseType: CGEventType,
                                mouseCursorPosition: CGPoint, 
                                mouseButton: CGMouseButton) -> CGEventRef;

    fn CGEventPost(tapLocation: CGEventTapLocation, event: CGEventRef);
}

fn main() {

    let x = 100.0;
    let y = 100.0;

    let MouseMoved = 5;

    unsafe {
        let mouse_ev = CGEventCreateMouseEvent(
            ptr::null(),
            MouseMoved, //CGEventType::MouseMoved,
            CGPoint::new(x, y),
            CGMouseButton::Left
        );

        if mouse_ev.is_null() {
            println!("ref null");
        }

        CGEventPost(CGEventTapLocation::HID, mouse_ev);     
    }
}

Publish to crates.io

This means adding a few items to Cargo.toml, and creating a small README.

Also it's probably a good idea to either rename this to rust-core-graphics-sys. Alternatively one could move the externs into an ffi folder and build an RAII API around them, but that's probably a job for another crate.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.