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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
/* $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 program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -22,7 +22,9 @@
#include <libintl.h>
#include <gtk/gtk.h>
#if GTK_CHECK_VERSION(3, 0, 0)
# include <gtk/gtkx.h>
# if defined(GDK_WINDOWING_X11)
# include <gtk/gtkx.h>
# endif
#endif
#include "window.h"
#include "../config.h"
@ -113,8 +115,14 @@ PanelWindow * panel_window_new(PanelAppletHelper * helper,
}
else
{
#if defined(GDK_WINDOWING_X11)
panel->window = gtk_plug_new(0);
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);
panel->height = icon_height + (PANEL_BORDER_WIDTH * 4);
@ -266,8 +274,14 @@ int panel_window_get_width(PanelWindow * panel)
/* panel_window_get_xid */
uint32_t panel_window_get_xid(PanelWindow * panel)
{
return (panel->position == PANEL_WINDOW_POSITION_EMBEDDED)
? gtk_plug_get_id(GTK_PLUG(panel->window)) : 0;
#if !defined(GDK_WINDOWING_X11)
(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$ */
/* 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 program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -22,12 +22,16 @@
#include <string.h>
#include <locale.h>
#include <libintl.h>
#include <System/error.h>
#include <Desktop.h>
#if GTK_CHECK_VERSION(3, 0, 0)
# include <gtk/gtkx.h>
#if defined(GDK_WINDOWING_X11)
# if GTK_CHECK_VERSION(3, 0, 0)
# include <gtk/gtkx.h>
# endif
#endif
#include "../include/Panel.h"
#include "../config.h"
#define _(string) gettext(string)
/* constants */
@ -50,8 +54,10 @@
static int _message(unsigned int timeout, char const * stock,
char const * title, char const * message);
#if defined(GDK_WINDOWING_X11)
/* callbacks */
static gboolean _message_on_timeout(gpointer data);
#endif
static int _error(char const * message, int ret);
static int _usage(void);
@ -62,6 +68,7 @@ static int _usage(void);
static int _message(unsigned int timeout, char const * stock,
char const * title, char const * message)
{
#if defined(GDK_WINDOWING_X11)
PangoFontDescription * bold;
GtkWidget * plug;
GtkWidget * hbox;
@ -136,9 +143,19 @@ static int _message(unsigned int timeout, char const * stock,
pango_font_description_free(bold);
gtk_main();
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 */
/* message_on_timeout */
static gboolean _message_on_timeout(gpointer data)
@ -148,6 +165,7 @@ static gboolean _message_on_timeout(gpointer data)
gtk_main_quit();
return FALSE;
}
#endif
/* error */