LINUX.ORG.RU

История изменений

Исправление 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(), но я ещё улучшил код.