WIP: Show status bar item with a backing metal layer
Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
parent
2b9fe0a2e6
commit
1c810d7e8d
2 changed files with 45 additions and 10 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue