LINUX.ORG.RU

#define XOPEN_SOURCE 600
#define _BSD_SOURCE

#include<stdlib.h>
#include<X11/Xlib.h>
#include<unistd.h>

int main(int argc, char **argv)
{
	Display* dpy	= XOpenDisplay(getenv("DISPLAY"));
	Window root		= DefaultRootWindow(dpy);
	GC g			= XCreateGC(dpy, root, 0, NULL);

	XSetForeground(dpy, g, WhitePixelOfScreen(DefaultScreenOfDisplay(dpy)));

	while(1)
	{
		XFillRectangle(dpy, root, g, random()%500, random()%500, 50, 40);

		if(random()%500<1)
			XClearWindow(dpy, root);

		XFlush(dpy);
		usleep(1);
	}

	XCloseDisplay(dpy);
}

К гтк привяжешь сам.

Cactus64k ()
Ответ на: комментарий от Cactus64k

А как я привяжу к gtk? Я не пойму. Может вы знаете как создать в таком примере gtk window?

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Оно и не должно появляться. Это то окно, которое на фоне рабочего стола.

monk ★★★★★ ()
Ответ на: комментарий от monk

А как я ему тогда vte terminal добавлю? Я вообще могу box'ы или grid'ы добавить к gdk?

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Никак. Там только рисовать можно. Как пример того, что будет

$ display -window root pict.jpg

Вместо pict.jpg любую картинку.

monk ★★★★★ ()
Ответ на: комментарий от monk

Плохо. А как хотябы сделать окно, чтобы его не было в списке запущенных окон, тоесть, нельзя было в значок свернуть, потому как таковой значок отключить?

u0atgKIRznY5 ()
Ответ на: комментарий от monk
$ display -window root pict.jpg
bash: display: команда не найдена
anonymous ()
Ответ на: комментарий от Cactus64k

#include<X11/Xlib.h>

Чот вы этот труп пинаете? Gtk уже давно под Wayland.

anonymous ()

Как-то так:

#include <gdk/gdk.h>
#include <gtk/gtk.h>

GtkWidget *window = NULL;

static void on_window_map(GtkWidget *widget,
                          gpointer   data)
{
    GdkWindow *window = gtk_widget_get_window(widget);

    gdk_window_lower(window);
}

#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;
}

static void create_window(GdkScreen *screen,
                          gpointer   data)
{
    GdkRectangle rect;
#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

    if (window != NULL)
    {
        gtk_widget_destroy(window);
    }
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

#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

#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_set_size_request(window, rect.width, rect.height);

    gtk_widget_show(window);
}

int main(int argc, char *argv[])
{
    GdkScreen *screen;

#if GTK_CHECK_VERSION(4, 0, 0)
    gtk_init();
#else
    gtk_init(&argc, &argv);
#endif

    screen = gdk_screen_get_default();

    create_window(screen, NULL);
    g_signal_connect(screen, "monitors-changed",
                     G_CALLBACK(create_window), NULL);

    gtk_main();
    return 0;
}

Darth_Revan ★★★★★ ()
Ответ на: комментарий от Darth_Revan

Нормально, и виджеты показывают, только иконки закрываются, а так то что нужно.

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Ну, иметь несколько desktop windows – это не очень рекомендованная штука.
И то окно, где значки, будет пытаться сделать ровно то же самое, поэтому то, какое окно ниже, определяется тем, какое окно появилось позже и позже вызвало XLowerWindow() (gdk_window_lower()).

Darth_Revan ★★★★★ ()
Ответ на: комментарий от neon1ks

Откуда этот пример?

Руками написал.

И что он делает?

Создаёт desktop window, залитый просто красным, размером с основной монитор, в случае изменения чего-то с мониторами – уничтожает и создаёт новое.
Сейчас мне кажется, что можно было бы просто gdk_window_move_resize() использовать.

Darth_Revan ★★★★★ ()
Ответ на: комментарий от neon1ks

Ну, если у тебя запущен Caja, то он перебьёт это окно своим desktop window.

Darth_Revan ★★★★★ ()
Ответ на: комментарий от Darth_Revan

Caja у меня нет. ubuntu 16.04 unity - или здесь не работает?

neon1ks ★★ ()
Ответ на: комментарий от neon1ks

Nautilus до версии 3.20 тоже делает непрозрачное окно, самостоятельно рисуя фон.
Если что, непрозрачное окно – это не баг, это фича, иначе вылезают другие проблемы ¯\_(ツ)_/¯.

Darth_Revan ★★★★★ ()

Наконец стал понимать. Что то подобие гаджетов как в windows 7, или как conky

neon1ks ★★ ()

А вот так окно будет создаваться над окном со значками:

#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 ★★★★★ ()
Последнее исправление: Darth_Revan (всего исправлений: 1)
Ответ на: комментарий от Darth_Revan

Респект тебе) Этот пример и в unity работает) Тоже хочу так знать GTK+ и другие библиотеки на основе Glib/GObject

neon1ks ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.