tasuren / overkami

An application that allows you to add wallpaper to any window.
https://freedom-wall.tasuren.jp
BSD 4-Clause "Original" or "Old" License
25 stars 3 forks source link

Mac対応 #9

Closed tasuren closed 2 years ago

tasuren commented 2 years ago

一応クリック貫通をする方法はCocoaにはあるっぽい。 Cocoaはあまり知らないが。

tasuren commented 2 years ago

Objective-CのランタイムAPIのバインディングのobjcっていうRustのライブラリを使うことで、wryが使っているtaoというライブラリのウィンドウのクリック貫通を有効にすることに成功した。 これでMac対応ができそうだ。

#[macro_use] extern crate objc;
use objc::runtime::{ Object, YES };

// クリック貫通するようにウィンドウの設定をobjcを使っていじる。windowはtaoのWindow
unsafe {
    let _: () = msg_send![window.ns_window() as *mut Object, setIgnoresMouseEvents: YES];
};
tasuren commented 2 years ago

一応クリックは貫通するが自分が求めていた貫通が再現できなかった。 というの壁紙がメインウィンドウとして認識されクリックを押しても背景を設定しているアプリにすぐクリックが行かず、ダブルクリックをしないとアプリがメインウィンドウとならない。 だからアプリをいじれない状態となってしまう。 ほかの対処法でウィンドウ(NSWindow)の状態(level)をCGWindowLevelKeyのオーバーレイというやつで設定することで、完璧に貫通するように表示することができた。 だがこれは常に最前列になってしまうため他のアプリをいじっている時も表示される。 対象のアプリがメインになる時だけオーバーレイとするというふうにする必要がありそう。

tasuren commented 2 years ago

一応クリックは貫通するが自分が求めていた貫通が再現できなかった。 というの壁紙がメインウィンドウとして認識されクリックを押しても背景を設定しているアプリにすぐクリックが行かず、ダブルクリックをしないとアプリがメインウィンドウとならない。 だからアプリをいじれない状態となってしまう。 ほかの対処法でウィンドウ(NSWindow)の状態(level)をCGWindowLevelKeyのオーバーレイというやつで設定することで、完璧に貫通するように表示することができた。 だがこれは常に最前列になってしまうため他のアプリをいじっている時も表示される。 対象のアプリがメインになる時だけオーバーレイとするというふうにする必要がありそう。

オーバーレイ無効化がなぜかできなかったから常にメインウィンドウにしないで一番前に表示するっていうorderFrontRegardlessっていうやつを毎回呼び出すことにした。

tasuren commented 2 years ago

とりあえず実装完了 クリックすると一瞬後ろに行き若干チカっとするのでどうにかしてLevelKeyのやつができるようにしたい。

tasuren commented 2 years ago

LevelKeyの切り替えができた。 それとそれをするためのやつがtaoに最初から実装されてた。