История изменений
Исправление Darth_Revan, (текущая версия) :
А вот так окно будет создаваться над окном со значками:
#include <gdk/gdk.h>
#include <gtk/gtk.h>
static void on_monitors_changed(GdkScreen *screen,
gpointer data)
{
GtkWidget *widget = GTK_WIDGET(data);
GdkWindow *window;
#if GTK_CHECK_VERSION(3, 22, 0)
GdkDisplay *display = gdk_screen_get_display(screen);
GdkMonitor *monitor = gdk_display_get_primary_monitor(display);
#else
int monitor = gdk_screen_get_primary_monitor(screen);
#endif
GdkRectangle rect;
#if GTK_CHECK_VERSION(3, 22, 0)
gdk_monitor_get_geometry(monitor, &rect);
#else
gdk_screen_get_monitor_geometry(screen, monitor, &rect);
#endif
gtk_widget_realize(widget);
window = gtk_widget_get_window(widget);
gdk_window_move_resize(window, rect.x, rect.y, rect.width, rect.height);
}
static void on_window_map(GtkWidget *widget,
gpointer data)
{
GdkWindow *window = gtk_widget_get_window(widget);
gdk_window_raise(window);
/* Force the window to move. */
on_monitors_changed(gtk_widget_get_screen(widget), widget);
}
#if GTK_CHECK_VERSION(3, 0, 0)
static gboolean on_window_draw(GtkWidget *widget,
cairo_t *cr,
gpointer data)
{
#else
static gboolean on_window_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
cairo_t *cr = gdk_cairo_create(event->window);
gdk_cairo_rectangle(cr, &event->area);
cairo_clip(cr);
#endif
cairo_set_source_rgb(cr, 204, 0, 0);
cairo_paint(cr);
#if !GTK_CHECK_VERSION(3, 0, 0)
cairo_destroy(cr);
#endif
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GdkScreen *screen;
#if GTK_CHECK_VERSION(4, 0, 0)
gtk_init();
#else
gtk_init(&argc, &argv);
#endif
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
screen = gtk_widget_get_screen(window);
#if !GTK_CHECK_VERSION(4, 0, 0)
gtk_widget_set_app_paintable(window, TRUE);
#endif
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(window), TRUE);
gtk_window_set_skip_pager_hint(GTK_WINDOW(window), TRUE);
gtk_window_set_keep_below(GTK_WINDOW(window), TRUE);
gtk_window_set_type_hint(GTK_WINDOW(window),
GDK_WINDOW_TYPE_HINT_DESKTOP);
g_signal_connect(window, "map",
G_CALLBACK(on_window_map), NULL);
#if GTK_CHECK_VERSION(3, 0, 0)
g_signal_connect(window, "draw",
G_CALLBACK(on_window_draw), NULL);
#else
g_signal_connect(window, "expose-event",
G_CALLBACK(on_window_expose_event), NULL);
#endif
gtk_widget_show(window);
g_signal_connect(screen, "monitors-changed",
G_CALLBACK(on_monitors_changed),
(gpointer) window);
gtk_main();
return 0;
}
gdk_window_raise()
вместо gdk_window_lower()
, но я ещё улучшил код.Исходная версия Darth_Revan, :
А вот так окно будет создаваться над окном со значками:
#include <gdk/gdk.h>
#include <gtk/gtk.h>
static void on_monitors_changed(GdkScreen *screen,
gpointer data)
{
GtkWidget *widget = GTK_WIDGET(data);
GdkWindow *window;
#if GTK_CHECK_VERSION(3, 22, 0)
GdkDisplay *display = gdk_screen_get_display(screen);
GdkMonitor *monitor = gdk_display_get_primary_monitor(display);
#else
int monitor = gdk_screen_get_primary_monitor(screen);
#endif
GdkRectangle rect;
#if GTK_CHECK_VERSION(3, 22, 0)
gdk_monitor_get_geometry(monitor, &rect);
#else
gdk_screen_get_monitor_geometry(screen, monitor, &rect);
#endif
gtk_widget_realize(widget);
window = gtk_widget_get_window(widget);
gdk_window_move_resize(window, rect.x, rect.y, rect.width, rect.height);
}
static void on_window_map(GtkWidget *widget,
gpointer data)
{
GdkWindow *window = gtk_widget_get_window(widget);
gdk_window_raise(window);
/* Force the window to move. */
on_monitors_changed(gtk_widget_get_screen(widget), widget);
}
#if GTK_CHECK_VERSION(3, 0, 0)
static gboolean on_window_draw(GtkWidget *widget,
cairo_t *cr,
gpointer data)
{
#else
static gboolean on_window_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
cairo_t *cr = gdk_cairo_create(event->window);
gdk_cairo_rectangle(cr, &event->area);
cairo_clip(cr);
#endif
cairo_set_source_rgb(cr, 204, 0, 0);
cairo_paint(cr);
#if !GTK_CHECK_VERSION(3, 0, 0)
cairo_destroy(cr);
#endif
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GdkScreen *screen;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_init();
#else
gtk_init(&argc, &argv);
#endif
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
screen = gtk_widget_get_screen(window);
#if !GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_set_app_paintable(window, TRUE);
#endif
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(window), TRUE);
gtk_window_set_skip_pager_hint(GTK_WINDOW(window), TRUE);
gtk_window_set_keep_below(GTK_WINDOW(window), TRUE);
gtk_window_set_type_hint(GTK_WINDOW(window),
GDK_WINDOW_TYPE_HINT_DESKTOP);
g_signal_connect(window, "map",
G_CALLBACK(on_window_map), NULL);
#if GTK_CHECK_VERSION(3, 0, 0)
g_signal_connect(window, "draw",
G_CALLBACK(on_window_draw), NULL);
#else
g_signal_connect(window, "expose-event",
G_CALLBACK(on_window_expose_event), NULL);
#endif
gtk_widget_show(window);
g_signal_connect(screen, "monitors-changed",
G_CALLBACK(on_monitors_changed),
(gpointer) window);
gtk_main();
return 0;
}
gdk_window_raise()
вместо gdk_window_lower()
, но я ещё улучшил код.