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::{
appkit::{NSSquareStatusItemLength, NSStatusBar},
base::{id, nil},
appkit::{NSSquareStatusItemLength, NSStatusBar, NSStatusItem, NSView},
base::{id, nil, NO, YES},
foundation::NSRect,
quartzcore::AutoresizingMask,
};
use core_foundation::base::TCFType;
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 {
pub fn add() -> Self {
const PIXEL_FORMAT: metal::MTLPixelFormat = metal::MTLPixelFormat::BGRA8Unorm;
unsafe {
let status_bar = NSStatusBar::systemStatusBar(nil);
let native_item: id =
msg_send![status_bar, statusItemWithLength: NSSquareStatusItemLength];
let button: id = msg_send![native_item, button];
let layer: id = msg_send![button, layer];
let _: () = msg_send![layer, setBackgroundColor: CGColor::rgb(1., 0., 0., 1.).as_concrete_TypeRef()];
let native_item =
StrongPtr::retain(status_bar.statusItemWithLength_(NSSquareStatusItemLength));
native_item.button().setWantsLayer(true);
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)
}
}

View file

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