Many improvements
This commit is contained in:
parent
658ba0dd60
commit
852fcb9487
1
Makefile
1
Makefile
|
@ -29,6 +29,7 @@ dist:
|
||||||
$(PACKAGE)-$(VERSION)/src/Makefile \
|
$(PACKAGE)-$(VERSION)/src/Makefile \
|
||||||
$(PACKAGE)-$(VERSION)/src/common.h \
|
$(PACKAGE)-$(VERSION)/src/common.h \
|
||||||
$(PACKAGE)-$(VERSION)/src/project.conf \
|
$(PACKAGE)-$(VERSION)/src/project.conf \
|
||||||
|
$(PACKAGE)-$(VERSION)/src/applets/battery.c \
|
||||||
$(PACKAGE)-$(VERSION)/src/applets/clock.c \
|
$(PACKAGE)-$(VERSION)/src/applets/clock.c \
|
||||||
$(PACKAGE)-$(VERSION)/src/applets/cpu.c \
|
$(PACKAGE)-$(VERSION)/src/applets/cpu.c \
|
||||||
$(PACKAGE)-$(VERSION)/src/applets/desktop.c \
|
$(PACKAGE)-$(VERSION)/src/applets/desktop.c \
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#ifndef PANEL_PANEL_H
|
#ifndef PANEL_PANEL_H
|
||||||
# define PANEL_PANEL_H
|
# define PANEL_PANEL_H
|
||||||
|
|
||||||
# include <System.h>
|
|
||||||
# include <gtk/gtk.h>
|
# include <gtk/gtk.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,6 +28,7 @@ typedef struct _PanelApplet PanelApplet;
|
||||||
typedef struct _PanelAppletHelper
|
typedef struct _PanelAppletHelper
|
||||||
{
|
{
|
||||||
GtkIconSize icon_size;
|
GtkIconSize icon_size;
|
||||||
|
int (*error)(void * priv, char const * message, int ret);
|
||||||
int (*logout_dialog)(void);
|
int (*logout_dialog)(void);
|
||||||
void (*position_menu)(GtkMenu * menu, gint * x, gint * y,
|
void (*position_menu)(GtkMenu * menu, gint * x, gint * y,
|
||||||
gboolean * push_in, gpointer data);
|
gboolean * push_in, gpointer data);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
TARGETS = clock.so cpu.so desktop.so lock.so logout.so main.so memory.so pager.so tasks.so
|
TARGETS = battery.so clock.so cpu.so desktop.so lock.so logout.so main.so memory.so pager.so tasks.so
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
DESTDIR =
|
DESTDIR =
|
||||||
LIBDIR = $(PREFIX)/lib
|
LIBDIR = $(PREFIX)/lib
|
||||||
|
@ -18,6 +18,13 @@ INSTALL = install
|
||||||
|
|
||||||
all: $(TARGETS)
|
all: $(TARGETS)
|
||||||
|
|
||||||
|
battery_OBJS = battery.o
|
||||||
|
battery_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
|
||||||
|
battery_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
||||||
|
|
||||||
|
battery.so: $(battery_OBJS)
|
||||||
|
$(LD) -o battery.so $(battery_OBJS)
|
||||||
|
|
||||||
clock_OBJS = clock.o
|
clock_OBJS = clock.o
|
||||||
clock_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
|
clock_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
|
||||||
clock_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
clock_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
||||||
|
@ -54,7 +61,7 @@ logout.so: $(logout_OBJS)
|
||||||
$(LD) -o logout.so $(logout_OBJS)
|
$(LD) -o logout.so $(logout_OBJS)
|
||||||
|
|
||||||
main_OBJS = main.o
|
main_OBJS = main.o
|
||||||
main_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
|
main_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) -D PREFIX=\"$(PREFIX)\" $(CFLAGSF) $(CFLAGS)
|
||||||
main_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
main_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
||||||
|
|
||||||
main.so: $(main_OBJS)
|
main.so: $(main_OBJS)
|
||||||
|
@ -81,40 +88,45 @@ tasks_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
|
||||||
tasks.so: $(tasks_OBJS)
|
tasks.so: $(tasks_OBJS)
|
||||||
$(LD) -o tasks.so $(tasks_OBJS)
|
$(LD) -o tasks.so $(tasks_OBJS)
|
||||||
|
|
||||||
clock.o: clock.c ../../config.h
|
battery.o: battery.c ../../include/panel.h
|
||||||
|
$(CC) $(battery_CFLAGS) -c battery.c
|
||||||
|
|
||||||
|
clock.o: clock.c ../../include/panel.h
|
||||||
$(CC) $(clock_CFLAGS) -c clock.c
|
$(CC) $(clock_CFLAGS) -c clock.c
|
||||||
|
|
||||||
cpu.o: cpu.c ../../config.h
|
cpu.o: cpu.c ../../include/panel.h
|
||||||
$(CC) $(cpu_CFLAGS) -c cpu.c
|
$(CC) $(cpu_CFLAGS) -c cpu.c
|
||||||
|
|
||||||
desktop.o: desktop.c
|
desktop.o: desktop.c ../../include/panel.h
|
||||||
$(CC) $(desktop_CFLAGS) -c desktop.c
|
$(CC) $(desktop_CFLAGS) -c desktop.c
|
||||||
|
|
||||||
lock.o: lock.c
|
lock.o: lock.c ../../include/panel.h
|
||||||
$(CC) $(lock_CFLAGS) -c lock.c
|
$(CC) $(lock_CFLAGS) -c lock.c
|
||||||
|
|
||||||
logout.o: logout.c
|
logout.o: logout.c ../../include/panel.h
|
||||||
$(CC) $(logout_CFLAGS) -c logout.c
|
$(CC) $(logout_CFLAGS) -c logout.c
|
||||||
|
|
||||||
main.o: main.c
|
main.o: main.c ../../include/panel.h
|
||||||
$(CC) $(main_CFLAGS) -c main.c
|
$(CC) $(main_CFLAGS) -c main.c
|
||||||
|
|
||||||
memory.o: memory.c ../../config.h
|
memory.o: memory.c ../../include/panel.h
|
||||||
$(CC) $(memory_CFLAGS) -c memory.c
|
$(CC) $(memory_CFLAGS) -c memory.c
|
||||||
|
|
||||||
pager.o: pager.c
|
pager.o: pager.c ../../include/panel.h
|
||||||
$(CC) $(pager_CFLAGS) -c pager.c
|
$(CC) $(pager_CFLAGS) -c pager.c
|
||||||
|
|
||||||
tasks.o: tasks.c ../../config.h
|
tasks.o: tasks.c ../../include/panel.h
|
||||||
$(CC) $(tasks_CFLAGS) -c tasks.c
|
$(CC) $(tasks_CFLAGS) -c tasks.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) $(clock_OBJS) $(cpu_OBJS) $(desktop_OBJS) $(lock_OBJS) $(logout_OBJS) $(main_OBJS) $(memory_OBJS) $(pager_OBJS) $(tasks_OBJS)
|
$(RM) $(battery_OBJS) $(clock_OBJS) $(cpu_OBJS) $(desktop_OBJS) $(lock_OBJS) $(logout_OBJS) $(main_OBJS) $(memory_OBJS) $(pager_OBJS) $(tasks_OBJS)
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
$(RM) $(TARGETS)
|
$(RM) $(TARGETS)
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
|
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
|
||||||
|
$(INSTALL) -m 0644 battery.so $(DESTDIR)$(LIBDIR)/Panel/applets/battery.so
|
||||||
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
|
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
|
||||||
$(INSTALL) -m 0644 clock.so $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so
|
$(INSTALL) -m 0644 clock.so $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so
|
||||||
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
|
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
|
||||||
|
@ -135,6 +147,7 @@ install: all
|
||||||
$(INSTALL) -m 0644 tasks.so $(DESTDIR)$(LIBDIR)/Panel/applets/tasks.so
|
$(INSTALL) -m 0644 tasks.so $(DESTDIR)$(LIBDIR)/Panel/applets/tasks.so
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
|
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/battery.so
|
||||||
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so
|
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so
|
||||||
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so
|
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so
|
||||||
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/desktop.so
|
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/desktop.so
|
||||||
|
|
220
src/applets/battery.c
Normal file
220
src/applets/battery.c
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
/* $Id$ */
|
||||||
|
/* Copyright (c) 2009 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
|
||||||
|
* the Free Software Foundation, version 3 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
# include <sys/envsys.h>
|
||||||
|
# include <fcntl.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
# include <paths.h>
|
||||||
|
#endif
|
||||||
|
#include "panel.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Battery */
|
||||||
|
/* private */
|
||||||
|
/* types */
|
||||||
|
typedef struct _Battery
|
||||||
|
{
|
||||||
|
PanelAppletHelper * helper;
|
||||||
|
GtkWidget * image;
|
||||||
|
GtkWidget * scale;
|
||||||
|
guint timeout;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int fd;
|
||||||
|
#endif
|
||||||
|
} Battery;
|
||||||
|
|
||||||
|
|
||||||
|
/* prototypes */
|
||||||
|
static GtkWidget * _battery_init(PanelApplet * applet);
|
||||||
|
static void _battery_destroy(PanelApplet * applet);
|
||||||
|
|
||||||
|
static void _battery_set(Battery * battery, gdouble value);
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
static gboolean _on_timeout(gpointer data);
|
||||||
|
|
||||||
|
|
||||||
|
/* public */
|
||||||
|
/* variables */
|
||||||
|
PanelApplet applet =
|
||||||
|
{
|
||||||
|
NULL,
|
||||||
|
_battery_init,
|
||||||
|
_battery_destroy,
|
||||||
|
PANEL_APPLET_POSITION_END,
|
||||||
|
FALSE,
|
||||||
|
TRUE,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* private */
|
||||||
|
/* functions */
|
||||||
|
/* battery_init */
|
||||||
|
static GtkWidget * _battery_init(PanelApplet * applet)
|
||||||
|
{
|
||||||
|
GtkWidget * ret;
|
||||||
|
Battery * battery;
|
||||||
|
|
||||||
|
if((battery = malloc(sizeof(*battery))) == NULL)
|
||||||
|
return NULL;
|
||||||
|
applet->priv = battery;
|
||||||
|
battery->helper = applet->helper;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
battery->fd = -1;
|
||||||
|
#endif
|
||||||
|
ret = gtk_hbox_new(FALSE, 0);
|
||||||
|
battery->image = gtk_image_new_from_icon_name("battery",
|
||||||
|
applet->helper->icon_size);
|
||||||
|
gtk_box_pack_start(GTK_BOX(ret), battery->image, FALSE, TRUE, 0);
|
||||||
|
battery->scale = gtk_vscale_new_with_range(0, 100, 1);
|
||||||
|
gtk_widget_set_sensitive(battery->scale, FALSE);
|
||||||
|
gtk_range_set_inverted(GTK_RANGE(battery->scale), TRUE);
|
||||||
|
gtk_scale_set_value_pos(GTK_SCALE(battery->scale), GTK_POS_RIGHT);
|
||||||
|
gtk_box_pack_start(GTK_BOX(ret), battery->scale, FALSE, TRUE, 0);
|
||||||
|
battery->timeout = g_timeout_add(1000, _on_timeout, battery);
|
||||||
|
_on_timeout(battery);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* battery_destroy */
|
||||||
|
static void _battery_destroy(PanelApplet * applet)
|
||||||
|
{
|
||||||
|
Battery * battery = applet->priv;
|
||||||
|
|
||||||
|
g_source_remove(battery->timeout);
|
||||||
|
if(battery->fd != -1)
|
||||||
|
close(battery->fd);
|
||||||
|
free(battery);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* battery_set */
|
||||||
|
static void _battery_set(Battery * battery, gdouble value)
|
||||||
|
{
|
||||||
|
/* XXX only set it when necessary? */
|
||||||
|
if(value <= 10.0)
|
||||||
|
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
|
||||||
|
"battery-caution", battery->helper->icon_size);
|
||||||
|
else if(value <= 20.0)
|
||||||
|
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
|
||||||
|
"battery-low", battery->helper->icon_size);
|
||||||
|
else
|
||||||
|
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
|
||||||
|
"battery", battery->helper->icon_size);
|
||||||
|
gtk_range_set_value(GTK_RANGE(battery->scale), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
/* on_timeout */
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
static int _timeout_tre(int fd, int sensor, envsys_tre_data_t * tre);
|
||||||
|
|
||||||
|
static gboolean _on_timeout(gpointer data)
|
||||||
|
{
|
||||||
|
Battery * battery = data;
|
||||||
|
int i;
|
||||||
|
envsys_basic_info_t info;
|
||||||
|
envsys_tre_data_t tre;
|
||||||
|
unsigned int rate = 0;
|
||||||
|
unsigned int charge = 0;
|
||||||
|
unsigned int maxcharge = 0;
|
||||||
|
|
||||||
|
if(battery->fd == -1
|
||||||
|
&& (battery->fd = open(_PATH_SYSMON, O_RDONLY) < 0))
|
||||||
|
return battery->helper->error(battery->helper->priv,
|
||||||
|
_PATH_SYSMON, TRUE);
|
||||||
|
for(i = 0; i >= 0; i++)
|
||||||
|
{
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
info.sensor = i;
|
||||||
|
if(ioctl(battery->fd, ENVSYS_GTREINFO, &info) == -1)
|
||||||
|
{
|
||||||
|
close(battery->fd);
|
||||||
|
battery->fd = -1;
|
||||||
|
/* FIXME use error() when known why it breaks once */
|
||||||
|
fprintf(stderr, "%s: %s\n", "ENVSYS_GTREINFO", strerror(
|
||||||
|
errno));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if(!(info.validflags & ENVSYS_FVALID))
|
||||||
|
break;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s() %d \"%s\"\n", __func__, i,
|
||||||
|
info.desc);
|
||||||
|
#endif
|
||||||
|
if(strcmp("acpiacad0 connected", info.desc) == 0
|
||||||
|
&& _timeout_tre(battery->fd, i, &tre) == 0
|
||||||
|
&& tre.validflags & ENVSYS_FCURVALID)
|
||||||
|
/* FIXME implement */
|
||||||
|
continue;
|
||||||
|
if(strncmp("acpibat ", info.desc, 7) != 0
|
||||||
|
|| info.desc[7] == '\0'
|
||||||
|
|| info.desc[8] != ' ')
|
||||||
|
continue;
|
||||||
|
if(strcmp("charge", &info.desc[9]) == 0
|
||||||
|
&& _timeout_tre(battery->fd, i, &tre) == 0
|
||||||
|
&& tre.validflags & ENVSYS_FCURVALID
|
||||||
|
&& tre.validflags & ENVSYS_FMAXVALID)
|
||||||
|
{
|
||||||
|
charge += tre.cur.data_us;
|
||||||
|
maxcharge += tre.max.data_us;
|
||||||
|
}
|
||||||
|
else if(strcmp("charge rate", &info.desc[9]) == 0
|
||||||
|
&& _timeout_tre(battery->fd, i, &tre) == 0
|
||||||
|
&& tre.validflags & ENVSYS_FCURVALID)
|
||||||
|
rate += tre.cur.data_us;
|
||||||
|
else if(strcmp("charging", &info.desc[9]) == 0
|
||||||
|
&& _timeout_tre(battery->fd, i, &tre) == 0
|
||||||
|
&& tre.validflags & ENVSYS_FCURVALID
|
||||||
|
&& tre.cur.data_us > 0)
|
||||||
|
/* FIXME implement */
|
||||||
|
continue;
|
||||||
|
else if(strcmp("discharge rate", &info.desc[9]) == 0
|
||||||
|
&& _timeout_tre(battery->fd, i, &tre) == 0
|
||||||
|
&& tre.validflags & ENVSYS_FCURVALID)
|
||||||
|
rate += tre.cur.data_us;
|
||||||
|
}
|
||||||
|
_battery_set(battery, (charge * 100.0) / maxcharge);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _timeout_tre(int fd, int sensor, envsys_tre_data_t * tre)
|
||||||
|
{
|
||||||
|
memset(tre, 0, sizeof(*tre));
|
||||||
|
tre->sensor = sensor;
|
||||||
|
if(ioctl(fd, ENVSYS_GTREDATA, tre) == -1)
|
||||||
|
return 1;
|
||||||
|
return !(tre->validflags & ENVSYS_FVALID);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static gboolean _on_timeout(gpointer data)
|
||||||
|
{
|
||||||
|
/* nothing to do */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -21,7 +21,6 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "panel.h"
|
#include "panel.h"
|
||||||
#include "../../config.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Clock */
|
/* Clock */
|
||||||
|
@ -29,6 +28,7 @@
|
||||||
/* types */
|
/* types */
|
||||||
typedef struct _Clock
|
typedef struct _Clock
|
||||||
{
|
{
|
||||||
|
PanelAppletHelper * helper;
|
||||||
GtkWidget * label;
|
GtkWidget * label;
|
||||||
guint timeout;
|
guint timeout;
|
||||||
} Clock;
|
} Clock;
|
||||||
|
@ -70,6 +70,7 @@ static GtkWidget * _clock_init(PanelApplet * applet)
|
||||||
if((clock = malloc(sizeof(*clock))) == NULL)
|
if((clock = malloc(sizeof(*clock))) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
applet->priv = clock;
|
applet->priv = clock;
|
||||||
|
clock->helper = applet->helper;
|
||||||
ret = gtk_frame_new(NULL);
|
ret = gtk_frame_new(NULL);
|
||||||
gtk_frame_set_shadow_type(GTK_FRAME(ret), GTK_SHADOW_IN);
|
gtk_frame_set_shadow_type(GTK_FRAME(ret), GTK_SHADOW_IN);
|
||||||
clock->label = gtk_label_new(" \n ");
|
clock->label = gtk_label_new(" \n ");
|
||||||
|
@ -108,8 +109,8 @@ static gboolean _on_timeout(gpointer data)
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
|
||||||
if(gettimeofday(&tv, NULL) != 0)
|
if(gettimeofday(&tv, NULL) != 0)
|
||||||
return error_set_print(PACKAGE, TRUE, "%s: %s", "gettimeofday",
|
return clock->helper->error(clock->helper->priv, "gettimeofday",
|
||||||
strerror(errno));
|
TRUE);
|
||||||
t = tv.tv_sec;
|
t = tv.tv_sec;
|
||||||
localtime_r(&t, &tm);
|
localtime_r(&t, &tm);
|
||||||
#ifndef EMBEDDED
|
#ifndef EMBEDDED
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
# include <sys/sysctl.h>
|
# include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
#include "panel.h"
|
#include "panel.h"
|
||||||
#include "../../config.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Cpu */
|
/* Cpu */
|
||||||
|
@ -32,6 +31,7 @@
|
||||||
/* types */
|
/* types */
|
||||||
typedef struct _Cpu
|
typedef struct _Cpu
|
||||||
{
|
{
|
||||||
|
PanelAppletHelper * helper;
|
||||||
GtkWidget * scale;
|
GtkWidget * scale;
|
||||||
guint timeout;
|
guint timeout;
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
|
@ -74,8 +74,12 @@ static GtkWidget * _cpu_init(PanelApplet * applet)
|
||||||
GtkWidget * widget;
|
GtkWidget * widget;
|
||||||
|
|
||||||
if((cpu = malloc(sizeof(*cpu))) == NULL)
|
if((cpu = malloc(sizeof(*cpu))) == NULL)
|
||||||
|
{
|
||||||
|
applet->helper->error(applet->helper->priv, "malloc", 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
applet->priv = cpu;
|
applet->priv = cpu;
|
||||||
|
cpu->helper = applet->helper;
|
||||||
ret = gtk_hbox_new(FALSE, 0);
|
ret = gtk_hbox_new(FALSE, 0);
|
||||||
desc = pango_font_description_new();
|
desc = pango_font_description_new();
|
||||||
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
|
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
|
||||||
|
@ -122,7 +126,7 @@ static gboolean _on_timeout(gpointer data)
|
||||||
gdouble value;
|
gdouble value;
|
||||||
|
|
||||||
if(sysctl(mib, 2, &cpu_time, &size, NULL, 0) < 0)
|
if(sysctl(mib, 2, &cpu_time, &size, NULL, 0) < 0)
|
||||||
return TRUE;
|
return cpu->helper->error(cpu->helper->priv, "sysctl", TRUE);
|
||||||
used = cpu_time[CP_USER] + cpu_time[CP_SYS] + cpu_time[CP_NICE]
|
used = cpu_time[CP_USER] + cpu_time[CP_SYS] + cpu_time[CP_NICE]
|
||||||
+ cpu_time[CP_INTR];
|
+ cpu_time[CP_INTR];
|
||||||
total = used + cpu_time[CP_IDLE];
|
total = used + cpu_time[CP_IDLE];
|
||||||
|
|
|
@ -15,12 +15,13 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <System.h>
|
||||||
#include "panel.h"
|
#include "panel.h"
|
||||||
#include "../common.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Main */
|
/* Main */
|
||||||
|
@ -31,6 +32,7 @@ typedef struct _Main
|
||||||
PanelAppletHelper * helper;
|
PanelAppletHelper * helper;
|
||||||
GSList * apps;
|
GSList * apps;
|
||||||
guint idle;
|
guint idle;
|
||||||
|
time_t refresh_mti;
|
||||||
} Main;
|
} Main;
|
||||||
|
|
||||||
typedef struct _MainMenu
|
typedef struct _MainMenu
|
||||||
|
@ -80,6 +82,7 @@ static gboolean _on_idle(gpointer data);
|
||||||
static void _on_lock(GtkWidget * widget, gpointer data);
|
static void _on_lock(GtkWidget * widget, gpointer data);
|
||||||
static void _on_logout(GtkWidget * widget, gpointer data);
|
static void _on_logout(GtkWidget * widget, gpointer data);
|
||||||
static void _on_run(GtkWidget * widget, gpointer data);
|
static void _on_run(GtkWidget * widget, gpointer data);
|
||||||
|
static gboolean _on_timeout(gpointer data);
|
||||||
|
|
||||||
|
|
||||||
/* public */
|
/* public */
|
||||||
|
@ -110,6 +113,7 @@ static GtkWidget * _main_init(PanelApplet * applet)
|
||||||
main->helper = applet->helper;
|
main->helper = applet->helper;
|
||||||
main->apps = NULL;
|
main->apps = NULL;
|
||||||
main->idle = g_idle_add(_on_idle, main);
|
main->idle = g_idle_add(_on_idle, main);
|
||||||
|
main->refresh_mti = 0;
|
||||||
applet->priv = main;
|
applet->priv = main;
|
||||||
ret = gtk_button_new();
|
ret = gtk_button_new();
|
||||||
image = gtk_image_new_from_icon_name("gnome-main-menu",
|
image = gtk_image_new_from_icon_name("gnome-main-menu",
|
||||||
|
@ -259,6 +263,45 @@ static GtkWidget * _main_menuitem(char const * label, char const * stock)
|
||||||
|
|
||||||
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
|
/* on_clicked */
|
||||||
|
static void _on_clicked(GtkWidget * widget, gpointer data)
|
||||||
|
{
|
||||||
|
Main * main = data;
|
||||||
|
GtkWidget * menu;
|
||||||
|
GtkWidget * menuitem;
|
||||||
|
|
||||||
|
menu = gtk_menu_new();
|
||||||
|
menuitem = _main_menuitem("Applications", "gnome-applications");
|
||||||
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), _main_applications(
|
||||||
|
main));
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
menuitem = gtk_separator_menu_item_new();
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
menuitem = _main_menuitem("Run...", GTK_STOCK_EXECUTE);
|
||||||
|
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(_on_run),
|
||||||
|
data);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
menuitem = gtk_separator_menu_item_new();
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES,
|
||||||
|
NULL);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
menuitem = gtk_separator_menu_item_new();
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
menuitem = _main_menuitem("Lock screen", "gnome-lockscreen");
|
||||||
|
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(_on_lock),
|
||||||
|
data);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
menuitem = _main_menuitem("Logout...", "gnome-logout");
|
||||||
|
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(_on_logout),
|
||||||
|
data);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
gtk_widget_show_all(menu);
|
||||||
|
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, main->helper->position_menu,
|
||||||
|
main->helper->priv, 0, gtk_get_current_event_time());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* on_idle */
|
/* on_idle */
|
||||||
static gint _idle_apps_compare(gconstpointer a, gconstpointer b);
|
static gint _idle_apps_compare(gconstpointer a, gconstpointer b);
|
||||||
|
|
||||||
|
@ -267,6 +310,8 @@ static gboolean _on_idle(gpointer data)
|
||||||
Main * main = data;
|
Main * main = data;
|
||||||
const char path[] = PREFIX "/share/applications";
|
const char path[] = PREFIX "/share/applications";
|
||||||
DIR * dir;
|
DIR * dir;
|
||||||
|
int fd;
|
||||||
|
struct stat st;
|
||||||
struct dirent * de;
|
struct dirent * de;
|
||||||
size_t len;
|
size_t len;
|
||||||
const char ext[] = ".desktop";
|
const char ext[] = ".desktop";
|
||||||
|
@ -279,9 +324,18 @@ static gboolean _on_idle(gpointer data)
|
||||||
|
|
||||||
if(main->apps != NULL)
|
if(main->apps != NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if((dir = opendir(path)) == NULL)
|
#if defined(__sun__)
|
||||||
|
if((fd = open(path, O_RDONLY)) < 0
|
||||||
|
|| fstat(fd, &st) != 0
|
||||||
|
|| (dir = fdopendir(fd)) == NULL)
|
||||||
|
#else
|
||||||
|
if((dir = opendir(path)) == NULL
|
||||||
|
|| (fd = dirfd(dir)) < 0
|
||||||
|
|| fstat(fd, &st) != 0)
|
||||||
|
#endif
|
||||||
return error_set_print("panel", FALSE, "%s: %s", path, strerror(
|
return error_set_print("panel", FALSE, "%s: %s", path, strerror(
|
||||||
errno));
|
errno));
|
||||||
|
main->refresh_mti = st.st_mtime;
|
||||||
while((de = readdir(dir)) != NULL)
|
while((de = readdir(dir)) != NULL)
|
||||||
{
|
{
|
||||||
len = strlen(de->d_name);
|
len = strlen(de->d_name);
|
||||||
|
@ -321,6 +375,7 @@ static gboolean _on_idle(gpointer data)
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
if(config != NULL)
|
if(config != NULL)
|
||||||
config_delete(config);
|
config_delete(config);
|
||||||
|
g_timeout_add(1000, _on_timeout, main);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,74 +395,6 @@ static gint _idle_apps_compare(gconstpointer a, gconstpointer b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* on_clicked */
|
|
||||||
#if 0
|
|
||||||
static void _clicked_menu_position(GtkMenu * menu, gint * x, gint * y,
|
|
||||||
gboolean * push_in, gpointer data);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void _on_clicked(GtkWidget * widget, gpointer data)
|
|
||||||
{
|
|
||||||
Main * main = data;
|
|
||||||
GtkWidget * menu;
|
|
||||||
GtkWidget * menuitem;
|
|
||||||
|
|
||||||
menu = gtk_menu_new();
|
|
||||||
menuitem = _main_menuitem("Applications", "gnome-applications");
|
|
||||||
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), _main_applications(
|
|
||||||
main));
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
menuitem = gtk_separator_menu_item_new();
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
menuitem = _main_menuitem("Run...", GTK_STOCK_EXECUTE);
|
|
||||||
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(_on_run),
|
|
||||||
data);
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
menuitem = gtk_separator_menu_item_new();
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES,
|
|
||||||
NULL);
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
menuitem = gtk_separator_menu_item_new();
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
menuitem = _main_menuitem("Lock screen", "gnome-lockscreen");
|
|
||||||
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(_on_lock),
|
|
||||||
data);
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
menuitem = _main_menuitem("Logout...", "gnome-logout");
|
|
||||||
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(_on_logout),
|
|
||||||
data);
|
|
||||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
|
||||||
gtk_widget_show_all(menu);
|
|
||||||
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, main->helper->position_menu,
|
|
||||||
main->helper->priv, 0, gtk_get_current_event_time());
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static void _clicked_menu_position(GtkMenu * menu, gint * x, gint * y,
|
|
||||||
gboolean * push_in, gpointer data)
|
|
||||||
{
|
|
||||||
Panel * panel = data;
|
|
||||||
GtkRequisition req;
|
|
||||||
|
|
||||||
gtk_widget_size_request(GTK_WIDGET(menu), &req);
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s() width=%d, height=%d\n", __func__,
|
|
||||||
req.width, req.height);
|
|
||||||
#endif
|
|
||||||
if(req.height <= 0)
|
|
||||||
return;
|
|
||||||
*x = PANEL_BORDER_WIDTH;
|
|
||||||
#if 0 /* FIXME figure a way for this */
|
|
||||||
*y = panel->height - PANEL_BORDER_WIDTH - PANEL_ICON_SIZE - req.height;
|
|
||||||
#else
|
|
||||||
*y = 1024 - PANEL_BORDER_WIDTH - PANEL_ICON_SIZE - req.height;
|
|
||||||
#endif
|
|
||||||
*push_in = TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* on_lock */
|
/* on_lock */
|
||||||
static void _on_lock(GtkWidget * widget, gpointer data)
|
static void _on_lock(GtkWidget * widget, gpointer data)
|
||||||
{
|
{
|
||||||
|
@ -439,3 +426,25 @@ static void _on_run(GtkWidget * widget, gpointer data)
|
||||||
|
|
||||||
g_spawn_async(NULL, argv, NULL, flags, NULL, NULL, NULL, NULL);
|
g_spawn_async(NULL, argv, NULL, flags, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* on_timeout */
|
||||||
|
static gboolean _on_timeout(gpointer data)
|
||||||
|
{
|
||||||
|
Main * main = data;
|
||||||
|
const char path[] = PREFIX "/share/applications";
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if(stat(path, &st) != 0)
|
||||||
|
return TRUE;
|
||||||
|
if(st.st_mtime == main->refresh_mti)
|
||||||
|
return TRUE;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s() resetting the menu\n", __func__);
|
||||||
|
#endif
|
||||||
|
g_slist_foreach(main->apps, (GFunc)config_delete, NULL);
|
||||||
|
g_slist_free(main->apps);
|
||||||
|
main->apps = NULL;
|
||||||
|
g_idle_add(_on_idle, main);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
# include <sys/sysctl.h>
|
# include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
#include "panel.h"
|
#include "panel.h"
|
||||||
#include "../../config.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Memory */
|
/* Memory */
|
||||||
|
@ -69,7 +68,10 @@ static GtkWidget * _memory_init(PanelApplet * applet)
|
||||||
GtkWidget * widget;
|
GtkWidget * widget;
|
||||||
|
|
||||||
if((memory = malloc(sizeof(*memory))) == NULL)
|
if((memory = malloc(sizeof(*memory))) == NULL)
|
||||||
|
{
|
||||||
|
applet->helper->error(applet->helper->priv, "malloc", 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
applet->priv = memory;
|
applet->priv = memory;
|
||||||
ret = gtk_hbox_new(FALSE, 0);
|
ret = gtk_hbox_new(FALSE, 0);
|
||||||
desc = pango_font_description_new();
|
desc = pango_font_description_new();
|
||||||
|
|
|
@ -103,7 +103,10 @@ static GtkWidget * _pager_init(PanelApplet * applet)
|
||||||
Pager * pager;
|
Pager * pager;
|
||||||
|
|
||||||
if((pager = malloc(sizeof(*pager))) == NULL)
|
if((pager = malloc(sizeof(*pager))) == NULL)
|
||||||
|
{
|
||||||
|
applet->helper->error(applet->helper->priv, "malloc", 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
applet->priv = pager;
|
applet->priv = pager;
|
||||||
pager->hbox = gtk_hbox_new(TRUE, 0);
|
pager->hbox = gtk_hbox_new(TRUE, 0);
|
||||||
g_signal_connect(G_OBJECT(pager->hbox), "screen-changed", G_CALLBACK(
|
g_signal_connect(G_OBJECT(pager->hbox), "screen-changed", G_CALLBACK(
|
||||||
|
@ -264,8 +267,7 @@ static void _pager_do(Pager * pager)
|
||||||
}
|
}
|
||||||
pager->widgets[i] = gtk_button_new_with_label(buf);
|
pager->widgets[i] = gtk_button_new_with_label(buf);
|
||||||
if(i == cur)
|
if(i == cur)
|
||||||
gtk_button_set_relief(GTK_BUTTON(pager->widgets[i]),
|
gtk_widget_set_sensitive(pager->widgets[i], FALSE);
|
||||||
GTK_RELIEF_NONE);
|
|
||||||
g_signal_connect(G_OBJECT(pager->widgets[i]), "clicked",
|
g_signal_connect(G_OBJECT(pager->widgets[i]), "clicked",
|
||||||
G_CALLBACK(_on_clicked), pager);
|
G_CALLBACK(_on_clicked), pager);
|
||||||
gtk_box_pack_start(GTK_BOX(pager->hbox), pager->widgets[i],
|
gtk_box_pack_start(GTK_BOX(pager->hbox), pager->widgets[i],
|
||||||
|
@ -325,9 +327,8 @@ static GdkFilterReturn _on_filter(GdkXEvent * xevent, GdkEvent * event,
|
||||||
if((cur = _pager_get_current_desktop(pager)) < 0)
|
if((cur = _pager_get_current_desktop(pager)) < 0)
|
||||||
return GDK_FILTER_CONTINUE;
|
return GDK_FILTER_CONTINUE;
|
||||||
for(i = 0; i < pager->widgets_cnt; i++)
|
for(i = 0; i < pager->widgets_cnt; i++)
|
||||||
gtk_button_set_relief(GTK_BUTTON(pager->widgets[i]),
|
gtk_widget_set_sensitive(pager->widgets[i], i == cur
|
||||||
i == cur ? GTK_RELIEF_NONE
|
? FALSE : TRUE);
|
||||||
: GTK_RELIEF_NORMAL);
|
|
||||||
return GDK_FILTER_CONTINUE;
|
return GDK_FILTER_CONTINUE;
|
||||||
}
|
}
|
||||||
if(xev->xproperty.atom == pager->atoms[
|
if(xev->xproperty.atom == pager->atoms[
|
||||||
|
|
|
@ -1,16 +1,24 @@
|
||||||
targets=clock,cpu,desktop,lock,logout,main,memory,pager,tasks
|
targets=battery,clock,cpu,desktop,lock,logout,main,memory,pager,tasks
|
||||||
cppflags_force=-I ../../include
|
cppflags_force=-I ../../include
|
||||||
cflags_force=`pkg-config --cflags gtk+-2.0` -fPIC
|
cflags_force=`pkg-config --cflags gtk+-2.0` -fPIC
|
||||||
cflags=-Wall -g -O2 -pedantic
|
cflags=-Wall -g -O2 -pedantic
|
||||||
dist=Makefile
|
dist=Makefile
|
||||||
|
|
||||||
|
[battery]
|
||||||
|
type=plugin
|
||||||
|
sources=battery.c
|
||||||
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
|
[battery.c]
|
||||||
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[clock]
|
[clock]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=clock.c
|
sources=clock.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
[clock.c]
|
[clock.c]
|
||||||
depends=../../config.h
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[cpu]
|
[cpu]
|
||||||
type=plugin
|
type=plugin
|
||||||
|
@ -18,46 +26,61 @@ sources=cpu.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
[cpu.c]
|
[cpu.c]
|
||||||
depends=../../config.h
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[desktop]
|
[desktop]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=desktop.c
|
sources=desktop.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
|
[desktop.c]
|
||||||
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[lock]
|
[lock]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=lock.c
|
sources=lock.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
|
[lock.c]
|
||||||
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[logout]
|
[logout]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=logout.c
|
sources=logout.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
|
[logout.c]
|
||||||
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[main]
|
[main]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=main.c
|
sources=main.c
|
||||||
#cppflags=-D PREFIX=\"$(PREFIX)\"
|
cppflags=-D PREFIX=\"$(PREFIX)\"
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
|
[main.c]
|
||||||
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[memory]
|
[memory]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=memory.c
|
sources=memory.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
[memory.c]
|
[memory.c]
|
||||||
depends=../../config.h
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[pager]
|
[pager]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=pager.c
|
sources=pager.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
|
[pager.c]
|
||||||
|
depends=../../include/panel.h
|
||||||
|
|
||||||
[tasks]
|
[tasks]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=tasks.c
|
sources=tasks.c
|
||||||
install=$(LIBDIR)/Panel/applets
|
install=$(LIBDIR)/Panel/applets
|
||||||
|
|
||||||
[tasks.c]
|
[tasks.c]
|
||||||
depends=../../config.h
|
depends=../../include/panel.h
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include "panel.h"
|
#include "panel.h"
|
||||||
#include "../../config.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Tasks */
|
/* Tasks */
|
||||||
|
@ -49,11 +48,16 @@ typedef struct _Task
|
||||||
Tasks * tasks;
|
Tasks * tasks;
|
||||||
Window window;
|
Window window;
|
||||||
GtkWidget * widget;
|
GtkWidget * widget;
|
||||||
|
GtkWidget * image;
|
||||||
|
#ifndef EMBEDDED
|
||||||
|
GtkWidget * label;
|
||||||
|
#endif
|
||||||
gboolean delete;
|
gboolean delete;
|
||||||
} Task;
|
} Task;
|
||||||
|
|
||||||
struct _Tasks
|
struct _Tasks
|
||||||
{
|
{
|
||||||
|
PanelAppletHelper * helper;
|
||||||
Task ** tasks;
|
Task ** tasks;
|
||||||
size_t tasks_cnt;
|
size_t tasks_cnt;
|
||||||
|
|
||||||
|
@ -138,17 +142,32 @@ static Task * _task_new(Tasks * tasks, Window window, char const * name,
|
||||||
GdkPixbuf * pixbuf)
|
GdkPixbuf * pixbuf)
|
||||||
{
|
{
|
||||||
Task * task;
|
Task * task;
|
||||||
|
GtkWidget * hbox;
|
||||||
|
|
||||||
if((task = malloc(sizeof(*task))) == NULL)
|
if((task = malloc(sizeof(*task))) == NULL)
|
||||||
|
{
|
||||||
|
tasks->helper->error(tasks->helper->priv, "malloc", 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
task->tasks = tasks;
|
task->tasks = tasks;
|
||||||
task->window = window;
|
task->window = window;
|
||||||
task->widget = gtk_button_new();
|
task->widget = gtk_button_new();
|
||||||
|
task->image = gtk_image_new();
|
||||||
task->delete = FALSE;
|
task->delete = FALSE;
|
||||||
|
hbox = gtk_hbox_new(FALSE, 0);
|
||||||
|
gtk_box_pack_start(GTK_BOX(hbox), task->image, FALSE, TRUE, 0);
|
||||||
#ifndef EMBEDDED
|
#ifndef EMBEDDED
|
||||||
gtk_button_set_alignment(GTK_BUTTON(task->widget), 0.0, 0.5);
|
task->label = gtk_label_new(name);
|
||||||
|
#if 0 /* FIXME doesn't seem to work properly */
|
||||||
|
gtk_label_set_ellipsize(GTK_LABEL(task->label), PANGO_ELLIPSIZE_END);
|
||||||
|
#endif
|
||||||
|
gtk_label_set_line_wrap(GTK_LABEL(task->label), TRUE);
|
||||||
|
gtk_label_set_line_wrap_mode(GTK_LABEL(task->label),
|
||||||
|
PANGO_WRAP_WORD_CHAR);
|
||||||
|
gtk_box_pack_start(GTK_BOX(hbox), task->label, FALSE, TRUE, 0);
|
||||||
gtk_widget_set_size_request(task->widget, tasks->icon_width, -1);
|
gtk_widget_set_size_request(task->widget, tasks->icon_width, -1);
|
||||||
#endif
|
#endif
|
||||||
|
gtk_container_add(GTK_CONTAINER(task->widget), hbox);
|
||||||
g_signal_connect(task->widget, "clicked", G_CALLBACK(_on_clicked),
|
g_signal_connect(task->widget, "clicked", G_CALLBACK(_on_clicked),
|
||||||
task);
|
task);
|
||||||
_task_set(task, name, pixbuf);
|
_task_set(task, name, pixbuf);
|
||||||
|
@ -167,26 +186,14 @@ static void _task_delete(Task * task)
|
||||||
/* task_set */
|
/* task_set */
|
||||||
static void _task_set(Task * task, char const * name, GdkPixbuf * pixbuf)
|
static void _task_set(Task * task, char const * name, GdkPixbuf * pixbuf)
|
||||||
{
|
{
|
||||||
GtkWidget * image;
|
|
||||||
|
|
||||||
#ifndef EMBEDDED
|
#ifndef EMBEDDED
|
||||||
gtk_button_set_label(task->widget, name);
|
gtk_label_set_text(GTK_LABEL(task->label), name);
|
||||||
#endif
|
#endif
|
||||||
gtk_widget_set_tooltip_text(task->widget, name);
|
gtk_widget_set_tooltip_text(task->widget, name);
|
||||||
if((image = gtk_button_get_image(GTK_BUTTON(task->widget))) == NULL)
|
if(pixbuf != NULL)
|
||||||
{
|
gtk_image_set_from_pixbuf(GTK_IMAGE(task->image), pixbuf);
|
||||||
if(pixbuf != NULL)
|
|
||||||
image = gtk_image_new_from_pixbuf(pixbuf);
|
|
||||||
else
|
|
||||||
image = gtk_image_new_from_stock(
|
|
||||||
GTK_STOCK_MISSING_IMAGE,
|
|
||||||
task->tasks->icon_size);
|
|
||||||
gtk_button_set_image(GTK_BUTTON(task->widget), image);
|
|
||||||
}
|
|
||||||
else if(pixbuf != NULL)
|
|
||||||
gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
|
|
||||||
else
|
else
|
||||||
gtk_image_set_from_stock(GTK_IMAGE(image),
|
gtk_image_set_from_stock(GTK_IMAGE(task->image),
|
||||||
GTK_STOCK_MISSING_IMAGE,
|
GTK_STOCK_MISSING_IMAGE,
|
||||||
task->tasks->icon_size);
|
task->tasks->icon_size);
|
||||||
}
|
}
|
||||||
|
@ -202,6 +209,7 @@ static GtkWidget * _tasks_init(PanelApplet * applet)
|
||||||
if((tasks = malloc(sizeof(*tasks))) == NULL)
|
if((tasks = malloc(sizeof(*tasks))) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
applet->priv = tasks;
|
applet->priv = tasks;
|
||||||
|
tasks->helper = applet->helper;
|
||||||
tasks->tasks = NULL;
|
tasks->tasks = NULL;
|
||||||
tasks->tasks_cnt = 0;
|
tasks->tasks_cnt = 0;
|
||||||
tasks->hbox = gtk_hbox_new(TRUE, 0);
|
tasks->hbox = gtk_hbox_new(TRUE, 0);
|
||||||
|
@ -450,9 +458,6 @@ static int _do_tasks_add(Tasks * tasks, Window window, char const * name,
|
||||||
if(i < tasks->tasks_cnt)
|
if(i < tasks->tasks_cnt)
|
||||||
{
|
{
|
||||||
p = tasks->tasks[i];
|
p = tasks->tasks[i];
|
||||||
#ifndef EMBEDDED
|
|
||||||
gtk_button_set_label(GTK_BUTTON(p->widget), name);
|
|
||||||
#endif
|
|
||||||
_task_set(p, name, pixbuf);
|
_task_set(p, name, pixbuf);
|
||||||
p->delete = FALSE;
|
p->delete = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -468,6 +473,9 @@ static int _do_tasks_add(Tasks * tasks, Window window, char const * name,
|
||||||
gtk_widget_show_all(p->widget);
|
gtk_widget_show_all(p->widget);
|
||||||
gtk_box_pack_start(GTK_BOX(tasks->hbox), p->widget, FALSE, TRUE,
|
gtk_box_pack_start(GTK_BOX(tasks->hbox), p->widget, FALSE, TRUE,
|
||||||
0);
|
0);
|
||||||
|
#ifdef EMBEDDED
|
||||||
|
gtk_box_reorder_child(GTK_BOX(tasks->hbox), p->widget, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ typedef struct _Panel Panel;
|
||||||
|
|
||||||
/* constants */
|
/* constants */
|
||||||
#define PANEL_BORDER_WIDTH 4
|
#define PANEL_BORDER_WIDTH 4
|
||||||
|
#define PANEL_ICON_SIZE GTK_ICON_SIZE_LARGE_TOOLBAR
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
|
|
38
src/panel.c
38
src/panel.c
|
@ -56,8 +56,9 @@ struct _Panel
|
||||||
|
|
||||||
/* prototypes */
|
/* prototypes */
|
||||||
/* helpers */
|
/* helpers */
|
||||||
static int _panel_logout_dialog(void);
|
static int _panel_helper_error(void * priv, char const * message, int ret);
|
||||||
static void _panel_position_menu(GtkMenu * menu, gint * x, gint * y,
|
static int _panel_helper_logout_dialog(void);
|
||||||
|
static void _panel_helper_position_menu(GtkMenu * menu, gint * x, gint * y,
|
||||||
gboolean * push_in, gpointer data);
|
gboolean * push_in, gpointer data);
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,9 +89,10 @@ Panel * panel_new(void)
|
||||||
gtk_icon_size_lookup(GTK_ICON_SIZE_LARGE_TOOLBAR, &panel->icon_width,
|
gtk_icon_size_lookup(GTK_ICON_SIZE_LARGE_TOOLBAR, &panel->icon_width,
|
||||||
&panel->icon_height);
|
&panel->icon_height);
|
||||||
panel->helper.priv = panel;
|
panel->helper.priv = panel;
|
||||||
panel->helper.icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
|
panel->helper.error = _panel_helper_error;
|
||||||
panel->helper.logout_dialog = _panel_logout_dialog;
|
panel->helper.icon_size = PANEL_ICON_SIZE;
|
||||||
panel->helper.position_menu = _panel_position_menu;
|
panel->helper.logout_dialog = _panel_helper_logout_dialog;
|
||||||
|
panel->helper.position_menu = _panel_helper_position_menu;
|
||||||
/* root window */
|
/* root window */
|
||||||
panel->root = gdk_screen_get_root_window(
|
panel->root = gdk_screen_get_root_window(
|
||||||
gdk_display_get_default_screen(
|
gdk_display_get_default_screen(
|
||||||
|
@ -132,10 +134,11 @@ static gboolean _on_idle(gpointer data)
|
||||||
Panel * panel = data;
|
Panel * panel = data;
|
||||||
/* FIXME load all plugins, a configuration file or ask the user */
|
/* FIXME load all plugins, a configuration file or ask the user */
|
||||||
#ifndef EMBEDDED
|
#ifndef EMBEDDED
|
||||||
const char * plugins[] = { "cpu", "clock", "desktop", "lock", "logout",
|
const char * plugins[] = { "battery", "clock", "cpu", "desktop", "lock",
|
||||||
"main", "memory", "pager", "tasks", NULL };
|
"logout", "main", "memory", "pager", "tasks", NULL };
|
||||||
#else
|
#else
|
||||||
const char * plugins[] = { "clock", "desktop", "main", "tasks", NULL };
|
const char * plugins[] = { "battery", "clock", "desktop", "main",
|
||||||
|
"tasks", NULL };
|
||||||
#endif
|
#endif
|
||||||
size_t i;
|
size_t i;
|
||||||
Plugin * plugin;
|
Plugin * plugin;
|
||||||
|
@ -254,8 +257,17 @@ static int _error_text(char const * message, int ret)
|
||||||
/* private */
|
/* private */
|
||||||
/* functions */
|
/* functions */
|
||||||
/* helpers */
|
/* helpers */
|
||||||
/* panel_logout_dialog */
|
/* panel_helper_error */
|
||||||
static int _panel_logout_dialog(void)
|
static int _panel_helper_error(void * priv, char const * message, int ret)
|
||||||
|
{
|
||||||
|
Panel * panel = priv;
|
||||||
|
|
||||||
|
return panel_error(panel, message, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* panel_helper_logout_dialog */
|
||||||
|
static int _panel_helper_logout_dialog(void)
|
||||||
{
|
{
|
||||||
GtkWidget * dialog;
|
GtkWidget * dialog;
|
||||||
const char message[] = "This will log you out of the current session,"
|
const char message[] = "This will log you out of the current session,"
|
||||||
|
@ -280,8 +292,8 @@ static int _panel_logout_dialog(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* panel_position_menu */
|
/* panel_helper_position_menu */
|
||||||
static void _panel_position_menu(GtkMenu * menu, gint * x, gint * y,
|
static void _panel_helper_position_menu(GtkMenu * menu, gint * x, gint * y,
|
||||||
gboolean * push_in, gpointer data)
|
gboolean * push_in, gpointer data)
|
||||||
{
|
{
|
||||||
Panel * panel = data;
|
Panel * panel = data;
|
||||||
|
@ -295,7 +307,7 @@ static void _panel_position_menu(GtkMenu * menu, gint * x, gint * y,
|
||||||
if(req.height <= 0)
|
if(req.height <= 0)
|
||||||
return;
|
return;
|
||||||
*x = PANEL_BORDER_WIDTH;
|
*x = PANEL_BORDER_WIDTH;
|
||||||
*y = panel->root_height - PANEL_BORDER_WIDTH - panel->icon_height
|
*y = panel->root_height - (PANEL_BORDER_WIDTH * 8) - panel->icon_height
|
||||||
- req.height;
|
- req.height;
|
||||||
*push_in = TRUE;
|
*push_in = TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user