butt/src/FLTK/FL/Fl_My_Double_Window.H
audioprog 031ca812ad init
2025-08-13 22:05:17 +02:00

96 lines
2.8 KiB
Objective-C

//
// Copyright 2007-2018 by Daniel Noethen.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
#ifndef FL_MY_DOUBLE_WINDOW_H
#define FL_MY_DOUBLE_WINDOW_H
#include <FL/x.H>
#include <FL/Fl_Double_Window.H>
#ifdef WIN32
#include <windows.h>
#include "tray_agent.h"
#include "fl_timer_funcs.h"
#include "fl_callbacks.h"
#elif __APPLE__
#import <Cocoa/Cocoa.h>
#else
#include <X11/Xlib.h>
#endif
class Fl_My_Double_Window : public Fl_Double_Window {
public:
bool is_main_window = false;
bool minimize_to_tray = false;
void stay_on_top(int ontop)
{
#ifdef WIN32
SetWindowPos(fl_xid(this), ontop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER);
#elif __APPLE__
if (ontop) {
[fl_xid(this) setLevel:NSFloatingWindowLevel];
}
else {
[fl_xid(this) setLevel:NSNormalWindowLevel];
}
#else // UNIX
XEvent e;
Atom WM_STATE = XInternAtom(fl_display, "_NET_WM_STATE", 0);
Atom WM_STATE_ABOVE = XInternAtom(fl_display, "_NET_WM_STATE_ABOVE", 0);
e.xclient.type = ClientMessage;
e.xclient.window = fl_xid(this);
e.xclient.message_type = WM_STATE;
e.xclient.format = 32;
e.xclient.data.l[0] = (long)ontop;
e.xclient.data.l[1] = (long)WM_STATE_ABOVE;
e.xclient.data.l[2] = (long)0;
e.xclient.data.l[3] = (long)0;
e.xclient.data.l[4] = (long)0;
XSendEvent(fl_display, RootWindow(fl_display, fl_screen), 0, SubstructureNotifyMask | SubstructureRedirectMask, &e);
XFlush(fl_display);
#endif
}
int handle(int event)
{
#ifdef WIN32
if (event == FL_HIDE && is_main_window == true && minimize_to_tray == true) {
int ret = tray_agent_send_cmd(TA_MINIMIZE);
if (ret == 0) {
Fl::remove_timeout(&agent_watchdog_timer);
Fl::add_timeout(1, &agent_watchdog_timer);
}
}
return Fl_Double_Window::handle(event);
#else
Fl_Double_Window::handle(event);
return 0;
#endif
}
Fl_My_Double_Window(int W, int H, const char *l = 0) : Fl_Double_Window(W, H, l) {}
Fl_My_Double_Window(int X, int Y, int W, int H, const char *l = 0) : Fl_Double_Window(X, Y, W, H, l) {}
~Fl_My_Double_Window() { hide(); }
};
#endif // FL_MY_DOUBLE_WINDOW_H