WIP: Show status bar item with a backing metal layer

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Antonio Scandurra 2022-09-09 15:07:41 +02:00
parent 2b9fe0a2e6
commit 1c810d7e8d
2 changed files with 45 additions and 10 deletions

View file

@ -1,22 +1,58 @@
use cocoa::{ use cocoa::{
appkit::{NSSquareStatusItemLength, NSStatusBar}, appkit::{NSSquareStatusItemLength, NSStatusBar, NSStatusItem, NSView},
base::{id, nil}, base::{id, nil, NO, YES},
foundation::NSRect,
quartzcore::AutoresizingMask,
}; };
use core_foundation::base::TCFType; use core_foundation::base::TCFType;
use core_graphics::color::CGColor; use core_graphics::color::CGColor;
use objc::{msg_send, sel, sel_impl}; use foreign_types::ForeignType;
use objc::{class, msg_send, rc::StrongPtr, sel, sel_impl};
pub struct StatusItem(id); pub struct StatusItem(StrongPtr);
impl StatusItem { impl StatusItem {
pub fn add() -> Self { pub fn add() -> Self {
const PIXEL_FORMAT: metal::MTLPixelFormat = metal::MTLPixelFormat::BGRA8Unorm;
unsafe { unsafe {
let status_bar = NSStatusBar::systemStatusBar(nil); let status_bar = NSStatusBar::systemStatusBar(nil);
let native_item: id = let native_item =
msg_send![status_bar, statusItemWithLength: NSSquareStatusItemLength]; StrongPtr::retain(status_bar.statusItemWithLength_(NSSquareStatusItemLength));
let button: id = msg_send![native_item, button]; native_item.button().setWantsLayer(true);
let layer: id = msg_send![button, layer];
let _: () = msg_send![layer, setBackgroundColor: CGColor::rgb(1., 0., 0., 1.).as_concrete_TypeRef()]; let device: metal::Device = if let Some(device) = metal::Device::system_default() {
device
} else {
log::error!("unable to access a compatible graphics device");
std::process::exit(1);
};
let layer: id = msg_send![class!(CAMetalLayer), layer];
let _: () = msg_send![layer, setDevice: device.as_ptr()];
let _: () = msg_send![layer, setPixelFormat: PIXEL_FORMAT];
let _: () = msg_send![layer, setAllowsNextDrawableTimeout: NO];
let _: () = msg_send![layer, setNeedsDisplayOnBoundsChange: YES];
let _: () = msg_send![layer, setPresentsWithTransaction: YES];
let _: () = msg_send![
layer,
setAutoresizingMask: AutoresizingMask::WIDTH_SIZABLE
| AutoresizingMask::HEIGHT_SIZABLE
];
let _: () = msg_send![
layer,
setBackgroundColor: CGColor::rgb(1., 0., 0., 1.).as_concrete_TypeRef()
];
let _: () = msg_send![native_item.button(), setLayer: layer];
let native_item_window: id = msg_send![native_item.button(), window];
dbg!(native_item_window.frame().as_CGRect());
// let rect_in_window: NSRect = msg_send![native_item.button(), convertRect: native_item.button().bounds() toView: nil];
// let screen_rect: NSRect =
// msg_send![native_item_window, convertRectToScreen: rect_in_window];
// dbg!(screen_rect.as_CGRect());
StatusItem(native_item) StatusItem(native_item)
} }
} }

View file

@ -88,7 +88,6 @@ fn main() {
app.run(move |cx| { app.run(move |cx| {
std::mem::forget(cx.platform().add_status_item()); std::mem::forget(cx.platform().add_status_item());
let client = client::Client::new(http.clone()); let client = client::Client::new(http.clone());
let mut languages = LanguageRegistry::new(login_shell_env_loaded); let mut languages = LanguageRegistry::new(login_shell_env_loaded);
languages.set_language_server_download_dir(zed::paths::LANGUAGES_DIR.clone()); languages.set_language_server_download_dir(zed::paths::LANGUAGES_DIR.clone());