Merge branch 'khorben/no-x11'

This commit is contained in:
Pierre Pronchery 2024-10-10 01:38:36 +02:00
commit fb69806f10
8 changed files with 301 additions and 125 deletions

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2016-2023 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2016-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Panel */ /* This file is part of DeforaOS Desktop Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -21,7 +21,7 @@
#include <errno.h> #include <errno.h>
#include <libintl.h> #include <libintl.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#ifdef GDK_WINDOWING_X11 #if defined(GDK_WINDOWING_X11)
# include <gdk/gdkx.h> # include <gdk/gdkx.h>
# include <X11/XKBlib.h> # include <X11/XKBlib.h>
# include <X11/extensions/XKBfile.h> # include <X11/extensions/XKBfile.h>
@ -38,6 +38,7 @@
typedef struct _PanelApplet typedef struct _PanelApplet
{ {
PanelAppletHelper * helper; PanelAppletHelper * helper;
#if defined(GDK_WINDOWING_X11)
GtkWidget * widget; GtkWidget * widget;
GtkWidget * leds[XkbNumIndicators]; GtkWidget * leds[XkbNumIndicators];
gulong source; gulong source;
@ -45,6 +46,7 @@ typedef struct _PanelApplet
GdkDisplay * display; GdkDisplay * display;
XkbDescPtr xkb; XkbDescPtr xkb;
#endif
} LEDs; } LEDs;
@ -54,9 +56,11 @@ static LEDs * _leds_init(PanelAppletHelper * helper, GtkWidget ** widget);
static void _leds_destroy(LEDs * leds); static void _leds_destroy(LEDs * leds);
/* callbacks */ /* callbacks */
#if defined(GDK_WINDOWING_X11)
static void _leds_on_screen_changed(GtkWidget * widget, GdkScreen * previous, static void _leds_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
gpointer data); gpointer data);
static gboolean _leds_on_timeout(gpointer data); static gboolean _leds_on_timeout(gpointer data);
#endif
/* public */ /* public */
@ -79,6 +83,7 @@ PanelAppletDefinition applet =
/* leds_init */ /* leds_init */
static LEDs * _leds_init(PanelAppletHelper * helper, GtkWidget ** widget) static LEDs * _leds_init(PanelAppletHelper * helper, GtkWidget ** widget)
{ {
#if defined(GDK_WINDOWING_X11)
LEDs * leds; LEDs * leds;
size_t i; size_t i;
@ -104,12 +109,20 @@ static LEDs * _leds_init(PanelAppletHelper * helper, GtkWidget ** widget)
gtk_widget_show(leds->widget); gtk_widget_show(leds->widget);
*widget = leds->widget; *widget = leds->widget;
return leds; return leds;
#else
(void) helper;
(void) widget;
error_set_code(-ENOSYS, "X11 support not detected");
return NULL;
#endif
} }
/* leds_destroy */ /* leds_destroy */
static void _leds_destroy(LEDs * leds) static void _leds_destroy(LEDs * leds)
{ {
#if defined(GDK_WINDOWING_X11)
/* XXX free xkb? */ /* XXX free xkb? */
if(leds->timeout != 0) if(leds->timeout != 0)
g_source_remove(leds->timeout); g_source_remove(leds->timeout);
@ -117,9 +130,13 @@ static void _leds_destroy(LEDs * leds)
g_signal_handler_disconnect(leds->widget, leds->source); g_signal_handler_disconnect(leds->widget, leds->source);
gtk_widget_destroy(leds->widget); gtk_widget_destroy(leds->widget);
object_delete(leds); object_delete(leds);
#else
(void) leds;
#endif
} }
#if defined(GDK_WINDOWING_X11)
/* callbacks */ /* callbacks */
/* leds_on_screen_changed */ /* leds_on_screen_changed */
static void _leds_on_screen_changed(GtkWidget * widget, GdkScreen * previous, static void _leds_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
@ -245,3 +262,4 @@ static gboolean _leds_on_timeout(gpointer data)
} }
return TRUE; return TRUE;
} }
#endif

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2012-2023 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2012-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Panel */ /* This file is part of DeforaOS Desktop Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -29,14 +29,16 @@
#include <errno.h> #include <errno.h>
#include <libintl.h> #include <libintl.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#ifdef GDK_WINDOWING_X11 #if defined(GDK_WINDOWING_X11)
# include <gdk/gdkx.h> # if GTK_CHECK_VERSION(3, 0, 0)
#endif # include <gtk/gtkx.h>
#if GTK_CHECK_VERSION(3, 0, 0) # else
# include <gtk/gtkx.h> # include <gdk/gdkx.h>
# endif
#endif #endif
#include <System.h> #include <System.h>
#include "Panel/applet.h" #include "Panel/applet.h"
#define _(string) gettext(string) #define _(string) gettext(string)
#define N_(string) string #define N_(string) string
@ -47,6 +49,7 @@
typedef struct _PanelApplet typedef struct _PanelApplet
{ {
PanelAppletHelper * helper; PanelAppletHelper * helper;
#if defined(GDK_WINDOWING_X11)
GtkWidget * widget; GtkWidget * widget;
guint source; guint source;
@ -65,6 +68,7 @@ typedef struct _PanelApplet
GtkWidget * pr_width; GtkWidget * pr_width;
GtkWidget * pr_height; GtkWidget * pr_height;
GtkWidget * pr_ratio; GtkWidget * pr_ratio;
#endif
} Mixer; } Mixer;
@ -76,6 +80,7 @@ static void _mixer_destroy(Mixer * mixer);
static GtkWidget * _mixer_settings(Mixer * mixer, gboolean apply, static GtkWidget * _mixer_settings(Mixer * mixer, gboolean apply,
gboolean reset); gboolean reset);
#if defined(GDK_WINDOWING_X11)
/* useful */ /* useful */
static int _mixer_spawn(Mixer * mixer, unsigned long * xid); static int _mixer_spawn(Mixer * mixer, unsigned long * xid);
@ -83,6 +88,7 @@ static int _mixer_spawn(Mixer * mixer, unsigned long * xid);
static void _mixer_on_child(GPid pid, gint status, gpointer data); static void _mixer_on_child(GPid pid, gint status, gpointer data);
static gboolean _mixer_on_removed(void); static gboolean _mixer_on_removed(void);
static void _mixer_on_toggled(GtkWidget * widget, gpointer data); static void _mixer_on_toggled(GtkWidget * widget, gpointer data);
#endif
/* constants */ /* constants */
@ -107,13 +113,16 @@ PanelAppletDefinition applet =
/* private */ /* private */
/* functions */ /* functions */
/* mixer_init */ /* mixer_init */
#if defined(GDK_WINDOWING_X11)
static void _init_size(Mixer * mixer, PanelAppletHelper * helper); static void _init_size(Mixer * mixer, PanelAppletHelper * helper);
/* callbacks */ /* callbacks */
static gboolean _init_idle(gpointer data); static gboolean _init_idle(gpointer data);
#endif
static Mixer * _mixer_init(PanelAppletHelper * helper, static Mixer * _mixer_init(PanelAppletHelper * helper,
GtkWidget ** widget) GtkWidget ** widget)
{ {
#if defined(GDK_WINDOWING_X11)
Mixer * mixer; Mixer * mixer;
GtkWidget * image; GtkWidget * image;
@ -131,9 +140,9 @@ static Mixer * _mixer_init(PanelAppletHelper * helper,
mixer->pr_box = NULL; mixer->pr_box = NULL;
_init_size(mixer, helper); _init_size(mixer, helper);
mixer->widget = gtk_toggle_button_new(); mixer->widget = gtk_toggle_button_new();
#if GTK_CHECK_VERSION(2, 12, 0) # if GTK_CHECK_VERSION(2, 12, 0)
gtk_widget_set_tooltip_text(mixer->widget, _("Show mixer")); gtk_widget_set_tooltip_text(mixer->widget, _("Show mixer"));
#endif # endif
gtk_button_set_relief(GTK_BUTTON(mixer->widget), GTK_RELIEF_NONE); gtk_button_set_relief(GTK_BUTTON(mixer->widget), GTK_RELIEF_NONE);
g_signal_connect(mixer->widget, "toggled", G_CALLBACK( g_signal_connect(mixer->widget, "toggled", G_CALLBACK(
_mixer_on_toggled), mixer); _mixer_on_toggled), mixer);
@ -144,8 +153,16 @@ static Mixer * _mixer_init(PanelAppletHelper * helper,
mixer->source = g_idle_add(_init_idle, mixer); mixer->source = g_idle_add(_init_idle, mixer);
*widget = mixer->widget; *widget = mixer->widget;
return mixer; return mixer;
#else
(void) helper;
(void) widget;
error_set_code(-ENOSYS, "X11 support not detected");
return NULL;
#endif
} }
#if defined(GDK_WINDOWING_X11)
static void _init_size(Mixer * mixer, PanelAppletHelper * helper) static void _init_size(Mixer * mixer, PanelAppletHelper * helper)
{ {
char const * p; char const * p;
@ -169,10 +186,10 @@ static void _init_size(Mixer * mixer, PanelAppletHelper * helper)
mixer->width = mixer->height * 3; mixer->width = mixer->height * 3;
else if(mixer->height == -1) else if(mixer->height == -1)
mixer->height = mixer->width / 3; mixer->height = mixer->width / 3;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s() width=%d height=%d\n", __func__, fprintf(stderr, "DEBUG: %s() width=%d height=%d\n", __func__,
mixer->width, mixer->height); mixer->width, mixer->height);
#endif # endif
} }
/* callbacks */ /* callbacks */
@ -185,9 +202,9 @@ static gboolean _init_idle(gpointer data)
return FALSE; return FALSE;
mixer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); mixer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_accept_focus(GTK_WINDOW(mixer->window), FALSE); gtk_window_set_accept_focus(GTK_WINDOW(mixer->window), FALSE);
#if GTK_CHECK_VERSION(2, 6, 0) # if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_focus_on_map(GTK_WINDOW(mixer->window), FALSE); gtk_window_set_focus_on_map(GTK_WINDOW(mixer->window), FALSE);
#endif # endif
/* XXX let this be configurable (resize applications automatically) */ /* XXX let this be configurable (resize applications automatically) */
gtk_window_set_type_hint(GTK_WINDOW(mixer->window), gtk_window_set_type_hint(GTK_WINDOW(mixer->window),
GDK_WINDOW_TYPE_HINT_DOCK); GDK_WINDOW_TYPE_HINT_DOCK);
@ -200,20 +217,26 @@ static gboolean _init_idle(gpointer data)
gtk_widget_show(mixer->socket); gtk_widget_show(mixer->socket);
return FALSE; return FALSE;
} }
#endif
/* mixer_destroy */ /* mixer_destroy */
static void _mixer_destroy(Mixer * mixer) static void _mixer_destroy(Mixer * mixer)
{ {
#if defined(GDK_WINDOWING_X11)
if(mixer->source > 0) if(mixer->source > 0)
g_source_remove(mixer->source); g_source_remove(mixer->source);
if(mixer->pid > 0) if(mixer->pid > 0)
g_spawn_close_pid(mixer->pid); g_spawn_close_pid(mixer->pid);
gtk_widget_destroy(mixer->widget); gtk_widget_destroy(mixer->widget);
free(mixer); free(mixer);
#else
(void) mixer;
#endif
} }
#if defined(GDK_WINDOWING_X11)
/* mixer_settings */ /* mixer_settings */
static void _settings_apply(Mixer * mixer, PanelAppletHelper * helper); static void _settings_apply(Mixer * mixer, PanelAppletHelper * helper);
static void _settings_reset(Mixer * mixer, PanelAppletHelper * helper); static void _settings_reset(Mixer * mixer, PanelAppletHelper * helper);
@ -221,16 +244,18 @@ static GtkWidget * _settings_widget(Mixer * mixer);
/* callbacks */ /* callbacks */
static void _settings_on_width_value_changed(gpointer data); static void _settings_on_width_value_changed(gpointer data);
static void _settings_on_height_value_changed(gpointer data); static void _settings_on_height_value_changed(gpointer data);
#endif
static GtkWidget * _mixer_settings(Mixer * mixer, gboolean apply, static GtkWidget * _mixer_settings(Mixer * mixer, gboolean apply,
gboolean reset) gboolean reset)
{ {
#if defined(GDK_WINDOWING_X11)
PanelAppletHelper * helper = mixer->helper; PanelAppletHelper * helper = mixer->helper;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%p, %s, %s)\n", __func__, (void *)mixer, fprintf(stderr, "DEBUG: %s(%p, %s, %s)\n", __func__, (void *)mixer,
apply ? "TRUE" : "FALSE", reset ? "TRUE" : "FALSE"); apply ? "TRUE" : "FALSE", reset ? "TRUE" : "FALSE");
#endif # endif
if(mixer->pr_box == NULL) if(mixer->pr_box == NULL)
{ {
mixer->pr_box = _settings_widget(mixer); mixer->pr_box = _settings_widget(mixer);
@ -241,8 +266,16 @@ static GtkWidget * _mixer_settings(Mixer * mixer, gboolean apply,
if(apply == TRUE) if(apply == TRUE)
_settings_apply(mixer, helper); _settings_apply(mixer, helper);
return mixer->pr_box; return mixer->pr_box;
#else
(void) mixer;
(void) apply;
(void) reset;
return NULL;
#endif
} }
#if defined(GDK_WINDOWING_X11)
static void _settings_apply(Mixer * mixer, PanelAppletHelper * helper) static void _settings_apply(Mixer * mixer, PanelAppletHelper * helper)
{ {
char const * p; char const * p;
@ -287,13 +320,13 @@ static GtkWidget * _settings_widget(Mixer * mixer)
GtkWidget * widget; GtkWidget * widget;
group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
#else # else
vbox = gtk_vbox_new(FALSE, 4); vbox = gtk_vbox_new(FALSE, 4);
hbox = gtk_hbox_new(FALSE, 4); hbox = gtk_hbox_new(FALSE, 4);
#endif # endif
widget = gtk_label_new(_("Command:")); widget = gtk_label_new(_("Command:"));
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
mixer->pr_command = gtk_entry_new(); mixer->pr_command = gtk_entry_new();
@ -301,18 +334,18 @@ static GtkWidget * _settings_widget(Mixer * mixer)
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
/* frame */ /* frame */
frame = gtk_frame_new(_("Size:")); frame = gtk_frame_new(_("Size:"));
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
#else # else
vbox2 = gtk_vbox_new(FALSE, 4); vbox2 = gtk_vbox_new(FALSE, 4);
#endif # endif
gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4); gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
/* width */ /* width */
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
#else # else
hbox = gtk_hbox_new(FALSE, 4); hbox = gtk_hbox_new(FALSE, 4);
#endif # endif
widget = gtk_label_new(_("Width:")); widget = gtk_label_new(_("Width:"));
gtk_size_group_add_widget(group, widget); gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
@ -323,11 +356,11 @@ static GtkWidget * _settings_widget(Mixer * mixer)
gtk_box_pack_start(GTK_BOX(hbox), mixer->pr_width, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), mixer->pr_width, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);
/* height */ /* height */
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
#else # else
hbox = gtk_hbox_new(FALSE, 4); hbox = gtk_hbox_new(FALSE, 4);
#endif # endif
widget = gtk_label_new(_("Height:")); widget = gtk_label_new(_("Height:"));
gtk_size_group_add_widget(group, widget); gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
@ -424,9 +457,9 @@ static void _mixer_on_child(GPid pid, gint status, gpointer data)
const int timeout = 1000; const int timeout = 1000;
Mixer * mixer = data; Mixer * mixer = data;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%u) %u\n", __func__, pid, mixer->pid); fprintf(stderr, "DEBUG: %s(%u) %u\n", __func__, pid, mixer->pid);
#endif # endif
if(mixer->source != 0 || mixer->pid != pid) if(mixer->source != 0 || mixer->pid != pid)
return; return;
if(WIFEXITED(status) || WIFSIGNALED(status)) if(WIFEXITED(status) || WIFSIGNALED(status))
@ -485,3 +518,4 @@ static void _mixer_on_toggled(GtkWidget * widget, gpointer data)
else else
gtk_widget_hide(mixer->window); gtk_widget_hide(mixer->window);
} }
#endif

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2010-2023 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2010-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Pager Panel */ /* This file is part of DeforaOS Pager Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -52,6 +52,7 @@ typedef struct _PanelApplet
{ {
PanelAppletHelper * helper; PanelAppletHelper * helper;
#if defined(GDK_WINDOWING_X11)
GtkWidget * box; GtkWidget * box;
gulong source; gulong source;
@ -62,10 +63,12 @@ typedef struct _PanelApplet
GdkDisplay * display; GdkDisplay * display;
GdkScreen * screen; GdkScreen * screen;
GdkWindow * root; GdkWindow * root;
#endif
} Pager; } Pager;
/* constants */ /* constants */
#if defined(GDK_WINDOWING_X11)
static const char * _pager_atom[PAGER_ATOM_COUNT] = static const char * _pager_atom[PAGER_ATOM_COUNT] =
{ {
"_NET_CURRENT_DESKTOP", "_NET_CURRENT_DESKTOP",
@ -73,12 +76,14 @@ static const char * _pager_atom[PAGER_ATOM_COUNT] =
"_NET_NUMBER_OF_DESKTOPS", "_NET_NUMBER_OF_DESKTOPS",
"UTF8_STRING" "UTF8_STRING"
}; };
#endif
/* prototypes */ /* prototypes */
static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget); static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget);
static void _pager_destroy(Pager * pager); static void _pager_destroy(Pager * pager);
#if defined(GDK_WINDOWING_X11)
/* accessors */ /* accessors */
static int _pager_get_current_desktop(Pager * pager); static int _pager_get_current_desktop(Pager * pager);
static char ** _pager_get_desktop_names(Pager * pager); static char ** _pager_get_desktop_names(Pager * pager);
@ -96,6 +101,7 @@ static GdkFilterReturn _pager_on_filter(GdkXEvent * xevent, GdkEvent * event,
gpointer data); gpointer data);
static void _pager_on_screen_changed(GtkWidget * widget, GdkScreen * previous, static void _pager_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
gpointer data); gpointer data);
#endif
/* public */ /* public */
@ -118,6 +124,7 @@ PanelAppletDefinition applet =
/* pager_init */ /* pager_init */
static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget) static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget)
{ {
#if defined(GDK_WINDOWING_X11)
Pager * pager; Pager * pager;
GtkOrientation orientation; GtkOrientation orientation;
@ -128,13 +135,13 @@ static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget)
} }
pager->helper = helper; pager->helper = helper;
orientation = panel_window_get_orientation(helper->window); orientation = panel_window_get_orientation(helper->window);
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
pager->box = gtk_box_new(orientation, 0); pager->box = gtk_box_new(orientation, 0);
gtk_box_set_homogeneous(GTK_BOX(pager->box), TRUE); gtk_box_set_homogeneous(GTK_BOX(pager->box), TRUE);
#else # else
pager->box = (orientation == GTK_ORIENTATION_VERTICAL) pager->box = (orientation == GTK_ORIENTATION_VERTICAL)
? gtk_vbox_new(TRUE, 0) : gtk_hbox_new(TRUE, 0); ? gtk_vbox_new(TRUE, 0) : gtk_hbox_new(TRUE, 0);
#endif # endif
pager->source = g_signal_connect(pager->box, "screen-changed", pager->source = g_signal_connect(pager->box, "screen-changed",
G_CALLBACK(_pager_on_screen_changed), pager); G_CALLBACK(_pager_on_screen_changed), pager);
pager->widgets = NULL; pager->widgets = NULL;
@ -144,12 +151,20 @@ static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget)
pager->root = NULL; pager->root = NULL;
*widget = pager->box; *widget = pager->box;
return pager; return pager;
#else
(void) helper;
(void) widget;
error_set_code(-ENOSYS, "X11 support not detected");
return NULL;
#endif
} }
/* pager_destroy */ /* pager_destroy */
static void _pager_destroy(Pager * pager) static void _pager_destroy(Pager * pager)
{ {
#if defined(GDK_WINDOWING_X11)
if(pager->source != 0) if(pager->source != 0)
g_signal_handler_disconnect(pager->box, pager->source); g_signal_handler_disconnect(pager->box, pager->source);
pager->source = 0; pager->source = 0;
@ -157,9 +172,13 @@ static void _pager_destroy(Pager * pager)
gdk_window_remove_filter(pager->root, _pager_on_filter, pager); gdk_window_remove_filter(pager->root, _pager_on_filter, pager);
gtk_widget_destroy(pager->box); gtk_widget_destroy(pager->box);
free(pager); free(pager);
#else
(void) pager;
#endif
} }
#if defined(GDK_WINDOWING_X11)
/* accessors */ /* accessors */
/* pager_get_current_desktop */ /* pager_get_current_desktop */
static int _pager_get_current_desktop(Pager * pager) static int _pager_get_current_desktop(Pager * pager)
@ -226,10 +245,10 @@ static int _pager_get_window_property(Pager * pager, Window window,
int format; int format;
unsigned long bytes; unsigned long bytes;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s(pager, window, %s, %lu)\n", __func__, fprintf(stderr, "DEBUG: %s(pager, window, %s, %lu)\n", __func__,
_pager_atom[property], atom); _pager_atom[property], atom);
#endif # endif
gdk_error_trap_push(); gdk_error_trap_push();
res = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(pager->display), window, res = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(pager->display), window,
pager->atoms[property], 0, G_MAXLONG, False, atom, pager->atoms[property], 0, G_MAXLONG, False, atom,
@ -264,9 +283,9 @@ static void _pager_do(Pager * pager)
XA_CARDINAL, &cnt, (void*)&p) != 0) XA_CARDINAL, &cnt, (void*)&p) != 0)
return; return;
l = *p; l = *p;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s() l=%ld\n", __func__, l); fprintf(stderr, "DEBUG: %s() l=%ld\n", __func__, l);
#endif # endif
XFree(p); XFree(p);
for(i = l; i < pager->widgets_cnt; i++) for(i = l; i < pager->widgets_cnt; i++)
if(pager->widgets[i] != NULL) if(pager->widgets[i] != NULL)
@ -319,22 +338,22 @@ static void _pager_refresh(Pager * pager)
if(cur < 0 || i != (unsigned int)cur) if(cur < 0 || i != (unsigned int)cur)
{ {
gtk_widget_set_sensitive(pager->widgets[i], TRUE); gtk_widget_set_sensitive(pager->widgets[i], TRUE);
#if GTK_CHECK_VERSION(2, 12, 0) # if GTK_CHECK_VERSION(2, 12, 0)
snprintf(buf, sizeof(buf), _("Switch to %s"), snprintf(buf, sizeof(buf), _("Switch to %s"),
gtk_button_get_label( gtk_button_get_label(
GTK_BUTTON(pager->widgets[i]))); GTK_BUTTON(pager->widgets[i])));
gtk_widget_set_tooltip_text(pager->widgets[i], buf); gtk_widget_set_tooltip_text(pager->widgets[i], buf);
#endif # endif
} }
else else
{ {
gtk_widget_set_sensitive(pager->widgets[i], FALSE); gtk_widget_set_sensitive(pager->widgets[i], FALSE);
#if GTK_CHECK_VERSION(2, 12, 0) # if GTK_CHECK_VERSION(2, 12, 0)
snprintf(buf, sizeof(buf), _("On %s"), snprintf(buf, sizeof(buf), _("On %s"),
gtk_button_get_label( gtk_button_get_label(
GTK_BUTTON(pager->widgets[i]))); GTK_BUTTON(pager->widgets[i])));
gtk_widget_set_tooltip_text(pager->widgets[i], buf); gtk_widget_set_tooltip_text(pager->widgets[i], buf);
#endif # endif
} }
} }
@ -424,3 +443,4 @@ static void _pager_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
pager->display, _pager_atom[i]); pager->display, _pager_atom[i]);
_pager_do(pager); _pager_do(pager);
} }
#endif

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2010-2023 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2010-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Pager Panel */ /* This file is part of DeforaOS Pager Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -20,15 +20,17 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#if GTK_CHECK_VERSION(3, 0, 0) #if defined(GDK_WINDOWING_X11)
# include <gtk/gtkx.h> # if GTK_CHECK_VERSION(3, 0, 0)
#endif # include <gtk/gtkx.h>
#ifdef GDK_WINDOWING_X11 # else
# include <gdk/gdkx.h> # include <gdk/gdkx.h>
# include <X11/Xatom.h> # include <X11/Xatom.h>
# endif
#endif #endif
#include <System.h> #include <System.h>
#include "Panel/applet.h" #include "Panel/applet.h"
#define N_(string) string #define N_(string) string
@ -38,9 +40,11 @@
typedef struct _PanelApplet typedef struct _PanelApplet
{ {
PanelAppletHelper * helper; PanelAppletHelper * helper;
#if defined(GDK_WINDOWING_X11)
GtkWidget * hbox; GtkWidget * hbox;
GtkWidget * owner; GtkWidget * owner;
gulong source; gulong source;
#endif
} Systray; } Systray;
@ -54,12 +58,14 @@ typedef struct _PanelApplet
static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget); static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget);
static void _systray_destroy(Systray * systray); static void _systray_destroy(Systray * systray);
#if defined(GDK_WINDOWING_X11)
/* callbacks */ /* callbacks */
static GdkFilterReturn _systray_on_filter(GdkXEvent * xevent, GdkEvent * event, static GdkFilterReturn _systray_on_filter(GdkXEvent * xevent, GdkEvent * event,
gpointer data); gpointer data);
static void _systray_on_owner_destroy(gpointer data); static void _systray_on_owner_destroy(gpointer data);
static void _systray_on_screen_changed(GtkWidget * widget, GdkScreen * previous, static void _systray_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
gpointer data); gpointer data);
#endif
/* public */ /* public */
@ -82,6 +88,7 @@ PanelAppletDefinition applet =
/* systray_init */ /* systray_init */
static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget) static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget)
{ {
#if defined(GDK_WINDOWING_X11)
Systray * systray; Systray * systray;
gint height = 24; gint height = 24;
@ -91,11 +98,11 @@ static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget)
return NULL; return NULL;
} }
systray->helper = helper; systray->helper = helper;
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
systray->hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); systray->hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
#else # else
systray->hbox = gtk_hbox_new(FALSE, 0); systray->hbox = gtk_hbox_new(FALSE, 0);
#endif # endif
gtk_icon_size_lookup(panel_window_get_icon_size(helper->window), NULL, gtk_icon_size_lookup(panel_window_get_icon_size(helper->window), NULL,
&height); &height);
gtk_widget_set_size_request(systray->hbox, -1, height); gtk_widget_set_size_request(systray->hbox, -1, height);
@ -105,12 +112,20 @@ static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget)
gtk_widget_show(systray->hbox); gtk_widget_show(systray->hbox);
*widget = systray->hbox; *widget = systray->hbox;
return systray; return systray;
#else
(void) helper;
(void) widget;
error_set_code(-ENOSYS, "X11 support not detected");
return NULL;
#endif
} }
/* systray_destroy */ /* systray_destroy */
static void _systray_destroy(Systray * systray) static void _systray_destroy(Systray * systray)
{ {
#if defined(GDK_WINDOWING_X11)
GdkWindow * window; GdkWindow * window;
if(systray->source != 0) if(systray->source != 0)
@ -124,9 +139,13 @@ static void _systray_destroy(Systray * systray)
} }
gtk_widget_destroy(systray->hbox); gtk_widget_destroy(systray->hbox);
free(systray); free(systray);
#else
(void) systray;
#endif
} }
#if defined(GDK_WINDOWING_X11)
/* callbacks */ /* callbacks */
/* systray_on_filter */ /* systray_on_filter */
static GdkFilterReturn _filter_clientmessage(Systray * systray, static GdkFilterReturn _filter_clientmessage(Systray * systray,
@ -139,9 +158,9 @@ static GdkFilterReturn _systray_on_filter(GdkXEvent * xevent, GdkEvent * event,
XEvent * xev = xevent; XEvent * xev = xevent;
(void) event; (void) event;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif # endif
if(xev->type == ClientMessage) if(xev->type == ClientMessage)
return _filter_clientmessage(systray, &xev->xclient); return _filter_clientmessage(systray, &xev->xclient);
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
@ -162,10 +181,10 @@ static GdkFilterReturn _filter_clientmessage(Systray * systray,
gtk_box_pack_start(GTK_BOX(systray->hbox), socket, gtk_box_pack_start(GTK_BOX(systray->hbox), socket,
FALSE, TRUE, 0); FALSE, TRUE, 0);
gtk_socket_add_id(GTK_SOCKET(socket), xev->data.l[2]); gtk_socket_add_id(GTK_SOCKET(socket), xev->data.l[2]);
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s() %ld\n", __func__, fprintf(stderr, "DEBUG: %s() %ld\n", __func__,
xev->data.l[2]); xev->data.l[2]);
#endif # endif
return GDK_FILTER_REMOVE; return GDK_FILTER_REMOVE;
} }
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
@ -233,3 +252,4 @@ static void _systray_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
| GDK_STRUCTURE_MASK); | GDK_STRUCTURE_MASK);
gdk_window_add_filter(window, _systray_on_filter, systray); gdk_window_add_filter(window, _systray_on_filter, systray);
} }
#endif

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2011-2023 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2011-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Panel */ /* This file is part of DeforaOS Desktop Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -20,14 +20,19 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <libintl.h> #include <libintl.h>
#include <gdk/gdk.h> #include <gtk/gtk.h>
#ifdef GDK_WINDOWING_X11 #if defined(GDK_WINDOWING_X11)
# include <gdk/gdkx.h> # if GTK_CHECK_VERSION(3, 0, 0)
# include <gtk/gtkx.h>
# else
# include <gdk/gdkx.h>
# endif
# include <X11/Xatom.h> # include <X11/Xatom.h>
#endif #endif
#include <System.h> #include <System.h>
#include <Desktop.h> #include <Desktop.h>
#include "Panel/applet.h" #include "Panel/applet.h"
#define _(string) gettext(string) #define _(string) gettext(string)
#define N_(string) string #define N_(string) string
@ -39,17 +44,20 @@
/* Tasks */ /* Tasks */
/* private */ /* private */
/* types */ /* types */
#define atom(a) TASKS_ATOM_ ## a #if defined(GDK_WINDOWING_X11)
# define atom(a) TASKS_ATOM_ ## a
typedef enum _TasksAtom typedef enum _TasksAtom
{ {
#include "tasks.atoms" # include "tasks.atoms"
} TasksAtom; } TasksAtom;
#define TASKS_ATOM_LAST TASKS_ATOM_UTF8_STRING # define TASKS_ATOM_LAST TASKS_ATOM_UTF8_STRING
#define TASKS_ATOM_COUNT (TASKS_ATOM_LAST + 1) # define TASKS_ATOM_COUNT (TASKS_ATOM_LAST + 1)
#undef atom # undef atom
#endif
typedef struct _PanelApplet Tasks; typedef struct _PanelApplet Tasks;
#if defined(GDK_WINDOWING_X11)
typedef struct _Task typedef struct _Task
{ {
Tasks * tasks; Tasks * tasks;
@ -60,10 +68,12 @@ typedef struct _Task
gboolean delete; gboolean delete;
gboolean reorder; gboolean reorder;
} Task; } Task;
#endif
struct _PanelApplet struct _PanelApplet
{ {
PanelAppletHelper * helper; PanelAppletHelper * helper;
#if defined(GDK_WINDOWING_X11)
Task ** tasks; Task ** tasks;
size_t tasks_cnt; size_t tasks_cnt;
gboolean label; gboolean label;
@ -81,23 +91,27 @@ struct _PanelApplet
GdkDisplay * display; GdkDisplay * display;
GdkScreen * screen; GdkScreen * screen;
GdkWindow * root; GdkWindow * root;
#endif
}; };
#if defined(GDK_WINDOWING_X11)
/* constants */ /* constants */
#define atom(a) "" # a # define atom(a) "" # a
static const char * _tasks_atom[TASKS_ATOM_COUNT] = static const char * _tasks_atom[TASKS_ATOM_COUNT] =
{ {
#include "tasks.atoms" # include "tasks.atoms"
}; };
#undef atom # undef atom
#define _NET_WM_MOVERESIZE_MOVE 8 /* movement only */ # define _NET_WM_MOVERESIZE_MOVE 8 /* movement only */
#define _NET_WM_MOVERESIZE_SIZE_KEYBOARD 9 /* size via keyboard */ # define _NET_WM_MOVERESIZE_SIZE_KEYBOARD 9 /* size via keyboard */
#define _NET_WM_MOVERESIZE_MOVE_KEYBOARD 10 /* move via keyboard */ # define _NET_WM_MOVERESIZE_MOVE_KEYBOARD 10 /* move via keyboard */
#endif
/* prototypes */ /* prototypes */
#if defined(GDK_WINDOWING_X11)
/* task */ /* task */
static Task * _task_new(Tasks * tasks, gboolean label, gboolean reorder, static Task * _task_new(Tasks * tasks, gboolean label, gboolean reorder,
Window window, char const * name, GdkPixbuf * pixbuf); Window window, char const * name, GdkPixbuf * pixbuf);
@ -106,11 +120,13 @@ static void _task_set(Task * task, char const * name, GdkPixbuf * pixbuf);
static void _task_toggle_state(Task * task, TasksAtom state); static void _task_toggle_state(Task * task, TasksAtom state);
static void _task_toggle_state2(Task * task, TasksAtom state1, static void _task_toggle_state2(Task * task, TasksAtom state1,
TasksAtom state2); TasksAtom state2);
#endif
/* tasks */ /* tasks */
static Tasks * _tasks_init(PanelAppletHelper * helper, GtkWidget ** widget); static Tasks * _tasks_init(PanelAppletHelper * helper, GtkWidget ** widget);
static void _tasks_destroy(Tasks * tasks); static void _tasks_destroy(Tasks * tasks);
#if defined(GDK_WINDOWING_X11)
/* accessors */ /* accessors */
static int _tasks_get_current_desktop(Tasks * tasks); static int _tasks_get_current_desktop(Tasks * tasks);
static int _tasks_get_text_property(Tasks * tasks, Window window, Atom property, static int _tasks_get_text_property(Tasks * tasks, Window window, Atom property,
@ -143,6 +159,7 @@ static void _task_on_popup_shade(gpointer data);
static void _task_on_popup_stick(gpointer data); static void _task_on_popup_stick(gpointer data);
static void _task_on_screen_changed(GtkWidget * widget, GdkScreen * previous, static void _task_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
gpointer data); gpointer data);
#endif
/* public */ /* public */
@ -164,6 +181,7 @@ PanelAppletDefinition applet =
}; };
#if defined(GDK_WINDOWING_X11)
/* private */ /* private */
/* functions */ /* functions */
/* Task */ /* Task */
@ -193,11 +211,11 @@ static Task * _task_new(Tasks * tasks, gboolean label, gboolean reorder,
task->image = gtk_image_new(); task->image = gtk_image_new();
task->delete = FALSE; task->delete = FALSE;
task->reorder = reorder; task->reorder = reorder;
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
#else # else
hbox = gtk_hbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0);
#endif # endif
gtk_box_pack_start(GTK_BOX(hbox), task->image, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), task->image, FALSE, TRUE, 0);
if(label) if(label)
{ {
@ -282,12 +300,14 @@ static void _task_toggle_state2(Task * task, TasksAtom state1,
&xev); &xev);
gdk_error_trap_pop_ignored(); gdk_error_trap_pop_ignored();
} }
#endif
/* Tasks */ /* Tasks */
/* tasks_init */ /* tasks_init */
static Tasks * _tasks_init(PanelAppletHelper * helper, GtkWidget ** widget) static Tasks * _tasks_init(PanelAppletHelper * helper, GtkWidget ** widget)
{ {
#if defined(GDK_WINDOWING_X11)
Tasks * tasks; Tasks * tasks;
char const * p; char const * p;
GtkOrientation orientation; GtkOrientation orientation;
@ -361,12 +381,20 @@ static Tasks * _tasks_init(PanelAppletHelper * helper, GtkWidget ** widget)
gtk_widget_show_all(tasks->widget); gtk_widget_show_all(tasks->widget);
*widget = tasks->widget; *widget = tasks->widget;
return tasks; return tasks;
#else
(void) helper;
(void) widget;
error_set_code(-ENOSYS, "X11 support not detected");
return NULL;
#endif
} }
/* tasks_destroy */ /* tasks_destroy */
static void _tasks_destroy(Tasks * tasks) static void _tasks_destroy(Tasks * tasks)
{ {
#if defined(GDK_WINDOWING_X11)
size_t i; size_t i;
if(tasks->source != 0) if(tasks->source != 0)
@ -381,9 +409,13 @@ static void _tasks_destroy(Tasks * tasks)
tasks->tasks_cnt = 0; tasks->tasks_cnt = 0;
gtk_widget_destroy(tasks->widget); gtk_widget_destroy(tasks->widget);
free(tasks); free(tasks);
#else
(void) tasks;
#endif
} }
#if defined(GDK_WINDOWING_X11)
/* accessors */ /* accessors */
/* tasks_get_current_desktop */ /* tasks_get_current_desktop */
static int _tasks_get_current_desktop(Tasks * tasks) static int _tasks_get_current_desktop(Tasks * tasks)
@ -415,22 +447,22 @@ static int _tasks_get_text_property(Tasks * tasks, Window window, Atom property,
char ** list; char ** list;
int i; int i;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s(tasks, window, %lu)\n", __func__, property); fprintf(stderr, "DEBUG: %s(tasks, window, %lu)\n", __func__, property);
#endif # endif
gdk_error_trap_push(); gdk_error_trap_push();
res = XGetTextProperty(GDK_DISPLAY_XDISPLAY(tasks->display), window, res = XGetTextProperty(GDK_DISPLAY_XDISPLAY(tasks->display), window,
&text, property); &text, property);
if(gdk_error_trap_pop() != 0 || res == 0) if(gdk_error_trap_pop() != 0 || res == 0)
return -1; return -1;
atom = gdk_x11_xatom_to_atom(text.encoding); atom = gdk_x11_xatom_to_atom(text.encoding);
#if GTK_CHECK_VERSION(2, 24, 0) # if GTK_CHECK_VERSION(2, 24, 0)
cnt = gdk_x11_display_text_property_to_text_list(tasks->display, cnt = gdk_x11_display_text_property_to_text_list(tasks->display,
atom, text.format, text.value, text.nitems, &list); atom, text.format, text.value, text.nitems, &list);
#else # else
cnt = gdk_text_property_to_utf8_list(atom, text.format, text.value, cnt = gdk_text_property_to_utf8_list(atom, text.format, text.value,
text.nitems, &list); text.nitems, &list);
#endif # endif
if(cnt > 0) if(cnt > 0)
{ {
*ret = list[0]; *ret = list[0];
@ -456,10 +488,10 @@ static int _tasks_get_window_property(Tasks * tasks, Window window,
int format; int format;
unsigned long bytes; unsigned long bytes;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s(tasks, window, %s, %lu)\n", __func__, fprintf(stderr, "DEBUG: %s(tasks, window, %s, %lu)\n", __func__,
_tasks_atom[property], atom); _tasks_atom[property], atom);
#endif # endif
gdk_error_trap_push(); gdk_error_trap_push();
res = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(tasks->display), window, res = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(tasks->display), window,
tasks->atom[property], 0, G_MAXLONG, False, atom, tasks->atom[property], 0, G_MAXLONG, False, atom,
@ -495,9 +527,9 @@ static void _tasks_do(Tasks * tasks)
unsigned long i; unsigned long i;
char * name; char * name;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif # endif
if(_tasks_get_window_property(tasks, GDK_WINDOW_XID(tasks->root), if(_tasks_get_window_property(tasks, GDK_WINDOW_XID(tasks->root),
TASKS_ATOM__NET_CLIENT_LIST, TASKS_ATOM__NET_CLIENT_LIST,
XA_WINDOW, &cnt, (void *)&windows) != 0) XA_WINDOW, &cnt, (void *)&windows) != 0)
@ -628,14 +660,14 @@ static int _do_tasks_add(Tasks * tasks, int desktop, Window window,
{ {
size_t i; size_t i;
Task * p = NULL; Task * p = NULL;
#ifndef EMBEDDED # ifndef EMBEDDED
unsigned long * l; unsigned long * l;
unsigned long cnt; unsigned long cnt;
int cur = -1; int cur = -1;
#endif # endif
Task ** q; Task ** q;
#ifndef EMBEDDED # ifndef EMBEDDED
if(_tasks_get_window_property(tasks, window, TASKS_ATOM__NET_WM_DESKTOP, if(_tasks_get_window_property(tasks, window, TASKS_ATOM__NET_WM_DESKTOP,
XA_CARDINAL, &cnt, (void *)&l) == 0) XA_CARDINAL, &cnt, (void *)&l) == 0)
{ {
@ -645,7 +677,7 @@ static int _do_tasks_add(Tasks * tasks, int desktop, Window window,
} }
if(cur >= 0 && cur != desktop) if(cur >= 0 && cur != desktop)
return 0; return 0;
#endif # endif
for(i = 0; i < tasks->tasks_cnt; i++) for(i = 0; i < tasks->tasks_cnt; i++)
if(tasks->tasks[i]->window == window) if(tasks->tasks[i]->window == window)
break; break;
@ -747,9 +779,9 @@ static void _clicked_activate(Task * task)
{ {
GdkDisplay * display; GdkDisplay * display;
XEvent xev; XEvent xev;
#ifdef DEBUG # ifdef DEBUG
int res; int res;
#endif # endif
display = task->tasks->display; display = task->tasks->display;
memset(&xev, 0, sizeof(xev)); memset(&xev, 0, sizeof(xev));
@ -762,19 +794,19 @@ static void _clicked_activate(Task * task)
xev.xclient.data.l[1] = gdk_x11_display_get_user_time(display); xev.xclient.data.l[1] = gdk_x11_display_get_user_time(display);
xev.xclient.data.l[2] = 0; xev.xclient.data.l[2] = 0;
gdk_error_trap_push(); gdk_error_trap_push();
#ifdef DEBUG # ifdef DEBUG
res = res =
#endif # endif
XSendEvent(GDK_DISPLAY_XDISPLAY(display), XSendEvent(GDK_DISPLAY_XDISPLAY(display),
GDK_WINDOW_XID(task->tasks->root), False, GDK_WINDOW_XID(task->tasks->root), False,
SubstructureNotifyMask | SubstructureRedirectMask, SubstructureNotifyMask | SubstructureRedirectMask,
&xev); &xev);
#ifdef DEBUG # ifdef DEBUG
if(gdk_error_trap_pop() != 0 || res != Success) if(gdk_error_trap_pop() != 0 || res != Success)
fprintf(stderr, "DEBUG: %s() error\n", __func__); fprintf(stderr, "DEBUG: %s() error\n", __func__);
#else # else
gdk_error_trap_pop_ignored(); gdk_error_trap_pop_ignored();
#endif # endif
} }
@ -799,10 +831,10 @@ static GdkFilterReturn _task_on_filter(GdkXEvent * xevent, GdkEvent * event,
if(xev->type != PropertyNotify) if(xev->type != PropertyNotify)
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
if(xev->xproperty.atom != tasks->atom[TASKS_ATOM__NET_CLIENT_LIST] if(xev->xproperty.atom != tasks->atom[TASKS_ATOM__NET_CLIENT_LIST]
#ifndef EMBEDDED # ifndef EMBEDDED
&& xev->xproperty.atom && xev->xproperty.atom
!= tasks->atom[TASKS_ATOM__NET_CURRENT_DESKTOP] != tasks->atom[TASKS_ATOM__NET_CURRENT_DESKTOP]
#endif # endif
) )
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
_tasks_do(tasks); _tasks_do(tasks);
@ -869,7 +901,7 @@ static gboolean _task_on_popup(gpointer data)
if(menu == NULL) if(menu == NULL)
menu = gtk_menu_new(); menu = gtk_menu_new();
if(items[j].stock != NULL) if(items[j].stock != NULL)
#if GTK_CHECK_VERSION(3, 10, 0) # if GTK_CHECK_VERSION(3, 10, 0)
{ {
menuitem = gtk_image_menu_item_new_with_label( menuitem = gtk_image_menu_item_new_with_label(
items[j].label); items[j].label);
@ -879,10 +911,10 @@ static gboolean _task_on_popup(gpointer data)
items[j].stock, items[j].stock,
GTK_ICON_SIZE_MENU)); GTK_ICON_SIZE_MENU));
} }
#else # else
menuitem = gtk_image_menu_item_new_from_stock( menuitem = gtk_image_menu_item_new_from_stock(
items[j].stock, NULL); items[j].stock, NULL);
#endif # endif
else else
menuitem = gtk_menu_item_new_with_label( menuitem = gtk_menu_item_new_with_label(
_(items[j].label)); _(items[j].label));
@ -1073,9 +1105,9 @@ static void _task_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
size_t i; size_t i;
(void) previous; (void) previous;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif # endif
if(tasks->root != NULL) if(tasks->root != NULL)
gdk_window_remove_filter(tasks->root, _task_on_filter, tasks); gdk_window_remove_filter(tasks->root, _task_on_filter, tasks);
tasks->screen = gtk_widget_get_screen(widget); tasks->screen = gtk_widget_get_screen(widget);
@ -1090,3 +1122,4 @@ static void _task_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
tasks->display, _tasks_atom[i]); tasks->display, _tasks_atom[i]);
_tasks_do(tasks); _tasks_do(tasks);
} }
#endif

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2011-2023 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2011-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Panel */ /* This file is part of DeforaOS Desktop Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -20,13 +20,14 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <libintl.h> #include <libintl.h>
#include <gdk/gdk.h> #include <gtk/gtk.h>
#ifdef GDK_WINDOWING_X11 #if defined(GDK_WINDOWING_X11)
# include <gdk/gdkx.h> # include <gdk/gdkx.h>
# include <X11/Xatom.h> # include <X11/Xatom.h>
#endif #endif
#include <System.h> #include <System.h>
#include "Panel/applet.h" #include "Panel/applet.h"
#define _(string) gettext(string) #define _(string) gettext(string)
#define N_(string) string #define N_(string) string
@ -37,6 +38,7 @@
typedef struct _PanelApplet typedef struct _PanelApplet
{ {
PanelAppletHelper * helper; PanelAppletHelper * helper;
#if defined(GDK_WINDOWING_X11)
GtkWidget * widget; GtkWidget * widget;
gulong source; gulong source;
@ -48,6 +50,7 @@ typedef struct _PanelApplet
Atom atom_name; Atom atom_name;
Atom atom_utf8_string; Atom atom_utf8_string;
Atom atom_visible_name; Atom atom_visible_name;
#endif
} Title; } Title;
@ -56,6 +59,7 @@ typedef struct _PanelApplet
static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget); static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget);
static void _title_destroy(Title * title); static void _title_destroy(Title * title);
#if defined(GDK_WINDOWING_X11)
/* accessors */ /* accessors */
static int _title_get_text_property(Title * title, Window window, Atom property, static int _title_get_text_property(Title * title, Window window, Atom property,
char ** ret); char ** ret);
@ -68,6 +72,7 @@ static GdkFilterReturn _title_on_filter(GdkXEvent * xevent, GdkEvent * event,
gpointer data); gpointer data);
static void _title_on_screen_changed(GtkWidget * widget, GdkScreen * previous, static void _title_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
gpointer data); gpointer data);
#endif
/* public */ /* public */
@ -90,6 +95,7 @@ PanelAppletDefinition applet =
/* title_init */ /* title_init */
static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget) static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget)
{ {
#if defined(GDK_WINDOWING_X11)
Title * title; Title * title;
PangoFontDescription * bold; PangoFontDescription * bold;
@ -102,11 +108,11 @@ static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget)
bold = pango_font_description_new(); bold = pango_font_description_new();
pango_font_description_set_weight(bold, PANGO_WEIGHT_BOLD); pango_font_description_set_weight(bold, PANGO_WEIGHT_BOLD);
title->widget = gtk_label_new(""); title->widget = gtk_label_new("");
#if GTK_CHECK_VERSION(3, 0, 0) # if GTK_CHECK_VERSION(3, 0, 0)
gtk_widget_override_font(title->widget, bold); gtk_widget_override_font(title->widget, bold);
#else # else
gtk_widget_modify_font(title->widget, bold); gtk_widget_modify_font(title->widget, bold);
#endif # endif
pango_font_description_free(bold); pango_font_description_free(bold);
title->source = g_signal_connect(title->widget, "screen-changed", title->source = g_signal_connect(title->widget, "screen-changed",
G_CALLBACK(_title_on_screen_changed), title); G_CALLBACK(_title_on_screen_changed), title);
@ -119,12 +125,20 @@ static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget)
gtk_widget_show(title->widget); gtk_widget_show(title->widget);
*widget = title->widget; *widget = title->widget;
return title; return title;
#else
(void) helper;
(void) widget;
error_set_code(-ENOSYS, "X11 support not detected");
return NULL;
#endif
} }
/* title_destroy */ /* title_destroy */
static void _title_destroy(Title * title) static void _title_destroy(Title * title)
{ {
#if defined(GDK_WINDOWING_X11)
if(title->source != 0) if(title->source != 0)
g_signal_handler_disconnect(title->widget, title->source); g_signal_handler_disconnect(title->widget, title->source);
title->source = 0; title->source = 0;
@ -132,9 +146,13 @@ static void _title_destroy(Title * title)
gdk_window_remove_filter(title->root, _title_on_filter, title); gdk_window_remove_filter(title->root, _title_on_filter, title);
gtk_widget_destroy(title->widget); gtk_widget_destroy(title->widget);
free(title); free(title);
#else
(void) title;
#endif
} }
#if defined(GDK_WINDOWING_X11)
/* accessors */ /* accessors */
/* title_get_window_property */ /* title_get_window_property */
static int _title_get_window_property(Title * title, Window window, static int _title_get_window_property(Title * title, Window window,
@ -146,10 +164,10 @@ static int _title_get_window_property(Title * title, Window window,
int format; int format;
unsigned long bytes; unsigned long bytes;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s(title, window, %lu, %lu)\n", __func__, fprintf(stderr, "DEBUG: %s(title, window, %lu, %lu)\n", __func__,
property, atom); property, atom);
#endif # endif
gdk_error_trap_push(); gdk_error_trap_push();
res = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(title->display), window, res = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(title->display), window,
property, 0, G_MAXLONG, False, atom, &type, &format, property, 0, G_MAXLONG, False, atom, &type, &format,
@ -178,22 +196,22 @@ static int _title_get_text_property(Title * title, Window window, Atom property,
char ** list; char ** list;
int i; int i;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s(title, window, %lu)\n", __func__, property); fprintf(stderr, "DEBUG: %s(title, window, %lu)\n", __func__, property);
#endif # endif
gdk_error_trap_push(); gdk_error_trap_push();
res = XGetTextProperty(GDK_DISPLAY_XDISPLAY(title->display), window, res = XGetTextProperty(GDK_DISPLAY_XDISPLAY(title->display), window,
&text, property); &text, property);
if(gdk_error_trap_pop() != 0 || res == 0) if(gdk_error_trap_pop() != 0 || res == 0)
return 1; return 1;
atom = gdk_x11_xatom_to_atom(text.encoding); atom = gdk_x11_xatom_to_atom(text.encoding);
#if GTK_CHECK_VERSION(2, 24, 0) # if GTK_CHECK_VERSION(2, 24, 0)
cnt = gdk_x11_display_text_property_to_text_list(title->display, cnt = gdk_x11_display_text_property_to_text_list(title->display,
atom, text.format, text.value, text.nitems, &list); atom, text.format, text.value, text.nitems, &list);
#else # else
cnt = gdk_text_property_to_utf8_list(atom, text.format, text.value, cnt = gdk_text_property_to_utf8_list(atom, text.format, text.value,
text.nitems, &list); text.nitems, &list);
#endif # endif
if(cnt > 0) if(cnt > 0)
{ {
*ret = list[0]; *ret = list[0];
@ -220,9 +238,9 @@ static void _title_do(Title * title)
Window * window; Window * window;
char * name; char * name;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif # endif
if(_title_get_window_property(title, GDK_WINDOW_XID(title->root), if(_title_get_window_property(title, GDK_WINDOW_XID(title->root),
title->atom_active, XA_WINDOW, &cnt, title->atom_active, XA_WINDOW, &cnt,
(void*)&window) != 0 || cnt != 1) (void*)&window) != 0 || cnt != 1)
@ -303,9 +321,9 @@ static void _title_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
GdkEventMask events; GdkEventMask events;
(void) previous; (void) previous;
#ifdef DEBUG # ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif # endif
if(title->root != NULL) if(title->root != NULL)
gdk_window_remove_filter(title->root, _title_on_filter, title); gdk_window_remove_filter(title->root, _title_on_filter, title);
title->screen = gtk_widget_get_screen(widget); title->screen = gtk_widget_get_screen(widget);
@ -325,3 +343,4 @@ static void _title_on_screen_changed(GtkWidget * widget, GdkScreen * previous,
title->display, "_NET_WM_VISIBLE_NAME"); title->display, "_NET_WM_VISIBLE_NAME");
_title_do(title); _title_do(title);
} }
#endif

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2011-2022 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2011-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Panel */ /* This file is part of DeforaOS Desktop Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -22,7 +22,9 @@
#include <libintl.h> #include <libintl.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#if GTK_CHECK_VERSION(3, 0, 0) #if GTK_CHECK_VERSION(3, 0, 0)
# include <gtk/gtkx.h> # if defined(GDK_WINDOWING_X11)
# include <gtk/gtkx.h>
# endif
#endif #endif
#include "window.h" #include "window.h"
#include "../config.h" #include "../config.h"
@ -113,8 +115,14 @@ PanelWindow * panel_window_new(PanelAppletHelper * helper,
} }
else else
{ {
#if defined(GDK_WINDOWING_X11)
panel->window = gtk_plug_new(0); panel->window = gtk_plug_new(0);
gtk_widget_show(panel->window); gtk_widget_show(panel->window);
#else
error_set_code(1, _("Unsupported panel position"));
object_delete(panel);
return NULL;
#endif
} }
gtk_container_set_border_width(GTK_CONTAINER(panel->window), 2); gtk_container_set_border_width(GTK_CONTAINER(panel->window), 2);
panel->height = icon_height + (PANEL_BORDER_WIDTH * 4); panel->height = icon_height + (PANEL_BORDER_WIDTH * 4);
@ -266,8 +274,14 @@ int panel_window_get_width(PanelWindow * panel)
/* panel_window_get_xid */ /* panel_window_get_xid */
uint32_t panel_window_get_xid(PanelWindow * panel) uint32_t panel_window_get_xid(PanelWindow * panel)
{ {
return (panel->position == PANEL_WINDOW_POSITION_EMBEDDED) #if !defined(GDK_WINDOWING_X11)
? gtk_plug_get_id(GTK_PLUG(panel->window)) : 0; (void) panel;
#else
if(panel->position == PANEL_WINDOW_POSITION_EMBEDDED)
return gtk_plug_get_id(GTK_PLUG(panel->window));
#endif
return 0;
} }

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2012-2022 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2012-2024 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Panel */ /* This file is part of DeforaOS Desktop Panel */
/* This program is free software: you can redistribute it and/or modify /* 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 * it under the terms of the GNU General Public License as published by
@ -22,12 +22,16 @@
#include <string.h> #include <string.h>
#include <locale.h> #include <locale.h>
#include <libintl.h> #include <libintl.h>
#include <System/error.h>
#include <Desktop.h> #include <Desktop.h>
#if GTK_CHECK_VERSION(3, 0, 0) #if defined(GDK_WINDOWING_X11)
# include <gtk/gtkx.h> # if GTK_CHECK_VERSION(3, 0, 0)
# include <gtk/gtkx.h>
# endif
#endif #endif
#include "../include/Panel.h" #include "../include/Panel.h"
#include "../config.h" #include "../config.h"
#define _(string) gettext(string) #define _(string) gettext(string)
/* constants */ /* constants */
@ -50,8 +54,10 @@
static int _message(unsigned int timeout, char const * stock, static int _message(unsigned int timeout, char const * stock,
char const * title, char const * message); char const * title, char const * message);
#if defined(GDK_WINDOWING_X11)
/* callbacks */ /* callbacks */
static gboolean _message_on_timeout(gpointer data); static gboolean _message_on_timeout(gpointer data);
#endif
static int _error(char const * message, int ret); static int _error(char const * message, int ret);
static int _usage(void); static int _usage(void);
@ -62,6 +68,7 @@ static int _usage(void);
static int _message(unsigned int timeout, char const * stock, static int _message(unsigned int timeout, char const * stock,
char const * title, char const * message) char const * title, char const * message)
{ {
#if defined(GDK_WINDOWING_X11)
PangoFontDescription * bold; PangoFontDescription * bold;
GtkWidget * plug; GtkWidget * plug;
GtkWidget * hbox; GtkWidget * hbox;
@ -136,9 +143,19 @@ static int _message(unsigned int timeout, char const * stock,
pango_font_description_free(bold); pango_font_description_free(bold);
gtk_main(); gtk_main();
return 0; return 0;
#else
(void) timeout;
(void) stock;
(void) title;
(void) message;
return error_set_print(PROGNAME_PANEL_MESSAGE, 2, "%s",
"X11 support not detected");
#endif
} }
#if defined(GDK_WINDOWING_X11)
/* callbacks */ /* callbacks */
/* message_on_timeout */ /* message_on_timeout */
static gboolean _message_on_timeout(gpointer data) static gboolean _message_on_timeout(gpointer data)
@ -148,6 +165,7 @@ static gboolean _message_on_timeout(gpointer data)
gtk_main_quit(); gtk_main_quit();
return FALSE; return FALSE;
} }
#endif
/* error */ /* error */