Many improvements

This commit is contained in:
Pierre Pronchery 2009-08-17 22:28:18 +00:00
parent 658ba0dd60
commit 852fcb9487
13 changed files with 429 additions and 134 deletions

View File

@ -29,6 +29,7 @@ dist:
$(PACKAGE)-$(VERSION)/src/Makefile \
$(PACKAGE)-$(VERSION)/src/common.h \
$(PACKAGE)-$(VERSION)/src/project.conf \
$(PACKAGE)-$(VERSION)/src/applets/battery.c \
$(PACKAGE)-$(VERSION)/src/applets/clock.c \
$(PACKAGE)-$(VERSION)/src/applets/cpu.c \
$(PACKAGE)-$(VERSION)/src/applets/desktop.c \

View File

@ -18,7 +18,6 @@
#ifndef PANEL_PANEL_H
# define PANEL_PANEL_H
# include <System.h>
# include <gtk/gtk.h>
@ -29,6 +28,7 @@ typedef struct _PanelApplet PanelApplet;
typedef struct _PanelAppletHelper
{
GtkIconSize icon_size;
int (*error)(void * priv, char const * message, int ret);
int (*logout_dialog)(void);
void (*position_menu)(GtkMenu * menu, gint * x, gint * y,
gboolean * push_in, gpointer data);

View File

@ -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
DESTDIR =
LIBDIR = $(PREFIX)/lib
@ -18,6 +18,13 @@ INSTALL = install
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_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
clock_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
@ -54,7 +61,7 @@ logout.so: $(logout_OBJS)
$(LD) -o logout.so $(logout_OBJS)
main_OBJS = main.o
main_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
main_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) -D PREFIX=\"$(PREFIX)\" $(CFLAGSF) $(CFLAGS)
main_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
main.so: $(main_OBJS)
@ -81,40 +88,45 @@ tasks_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
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
cpu.o: cpu.c ../../config.h
cpu.o: cpu.c ../../include/panel.h
$(CC) $(cpu_CFLAGS) -c cpu.c
desktop.o: desktop.c
desktop.o: desktop.c ../../include/panel.h
$(CC) $(desktop_CFLAGS) -c desktop.c
lock.o: lock.c
lock.o: lock.c ../../include/panel.h
$(CC) $(lock_CFLAGS) -c lock.c
logout.o: logout.c
logout.o: logout.c ../../include/panel.h
$(CC) $(logout_CFLAGS) -c logout.c
main.o: main.c
main.o: main.c ../../include/panel.h
$(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
pager.o: pager.c
pager.o: pager.c ../../include/panel.h
$(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
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
$(RM) $(TARGETS)
install: all
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
$(INSTALL) -m 0644 battery.so $(DESTDIR)$(LIBDIR)/Panel/applets/battery.so
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
$(INSTALL) -m 0644 clock.so $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so
$(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets
@ -135,6 +147,7 @@ install: all
$(INSTALL) -m 0644 tasks.so $(DESTDIR)$(LIBDIR)/Panel/applets/tasks.so
uninstall:
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/battery.so
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so
$(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/desktop.so

220
src/applets/battery.c Normal file
View 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

View File

@ -21,7 +21,6 @@
#include <time.h>
#include <errno.h>
#include "panel.h"
#include "../../config.h"
/* Clock */
@ -29,6 +28,7 @@
/* types */
typedef struct _Clock
{
PanelAppletHelper * helper;
GtkWidget * label;
guint timeout;
} Clock;
@ -70,6 +70,7 @@ static GtkWidget * _clock_init(PanelApplet * applet)
if((clock = malloc(sizeof(*clock))) == NULL)
return NULL;
applet->priv = clock;
clock->helper = applet->helper;
ret = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(ret), GTK_SHADOW_IN);
clock->label = gtk_label_new(" \n ");
@ -108,8 +109,8 @@ static gboolean _on_timeout(gpointer data)
char buf[32];
if(gettimeofday(&tv, NULL) != 0)
return error_set_print(PACKAGE, TRUE, "%s: %s", "gettimeofday",
strerror(errno));
return clock->helper->error(clock->helper->priv, "gettimeofday",
TRUE);
t = tv.tv_sec;
localtime_r(&t, &tm);
#ifndef EMBEDDED

View File

@ -24,7 +24,6 @@
# include <sys/sysctl.h>
#endif
#include "panel.h"
#include "../../config.h"
/* Cpu */
@ -32,6 +31,7 @@
/* types */
typedef struct _Cpu
{
PanelAppletHelper * helper;
GtkWidget * scale;
guint timeout;
#ifdef __NetBSD__
@ -74,8 +74,12 @@ static GtkWidget * _cpu_init(PanelApplet * applet)
GtkWidget * widget;
if((cpu = malloc(sizeof(*cpu))) == NULL)
{
applet->helper->error(applet->helper->priv, "malloc", 0);
return NULL;
}
applet->priv = cpu;
cpu->helper = applet->helper;
ret = gtk_hbox_new(FALSE, 0);
desc = pango_font_description_new();
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
@ -122,7 +126,7 @@ static gboolean _on_timeout(gpointer data)
gdouble value;
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]
+ cpu_time[CP_INTR];
total = used + cpu_time[CP_IDLE];

View File

@ -15,12 +15,13 @@
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <System.h>
#include "panel.h"
#include "../common.h"
/* Main */
@ -31,6 +32,7 @@ typedef struct _Main
PanelAppletHelper * helper;
GSList * apps;
guint idle;
time_t refresh_mti;
} Main;
typedef struct _MainMenu
@ -80,6 +82,7 @@ static gboolean _on_idle(gpointer data);
static void _on_lock(GtkWidget * widget, gpointer data);
static void _on_logout(GtkWidget * widget, gpointer data);
static void _on_run(GtkWidget * widget, gpointer data);
static gboolean _on_timeout(gpointer data);
/* public */
@ -110,6 +113,7 @@ static GtkWidget * _main_init(PanelApplet * applet)
main->helper = applet->helper;
main->apps = NULL;
main->idle = g_idle_add(_on_idle, main);
main->refresh_mti = 0;
applet->priv = main;
ret = gtk_button_new();
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 */
/* 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 */
static gint _idle_apps_compare(gconstpointer a, gconstpointer b);
@ -267,6 +310,8 @@ static gboolean _on_idle(gpointer data)
Main * main = data;
const char path[] = PREFIX "/share/applications";
DIR * dir;
int fd;
struct stat st;
struct dirent * de;
size_t len;
const char ext[] = ".desktop";
@ -279,9 +324,18 @@ static gboolean _on_idle(gpointer data)
if(main->apps != NULL)
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(
errno));
main->refresh_mti = st.st_mtime;
while((de = readdir(dir)) != NULL)
{
len = strlen(de->d_name);
@ -321,6 +375,7 @@ static gboolean _on_idle(gpointer data)
closedir(dir);
if(config != NULL)
config_delete(config);
g_timeout_add(1000, _on_timeout, main);
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 */
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);
}
/* 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;
}

View File

@ -23,7 +23,6 @@
# include <sys/sysctl.h>
#endif
#include "panel.h"
#include "../../config.h"
/* Memory */
@ -69,7 +68,10 @@ static GtkWidget * _memory_init(PanelApplet * applet)
GtkWidget * widget;
if((memory = malloc(sizeof(*memory))) == NULL)
{
applet->helper->error(applet->helper->priv, "malloc", 0);
return NULL;
}
applet->priv = memory;
ret = gtk_hbox_new(FALSE, 0);
desc = pango_font_description_new();

View File

@ -103,7 +103,10 @@ static GtkWidget * _pager_init(PanelApplet * applet)
Pager * pager;
if((pager = malloc(sizeof(*pager))) == NULL)
{
applet->helper->error(applet->helper->priv, "malloc", 0);
return NULL;
}
applet->priv = pager;
pager->hbox = gtk_hbox_new(TRUE, 0);
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);
if(i == cur)
gtk_button_set_relief(GTK_BUTTON(pager->widgets[i]),
GTK_RELIEF_NONE);
gtk_widget_set_sensitive(pager->widgets[i], FALSE);
g_signal_connect(G_OBJECT(pager->widgets[i]), "clicked",
G_CALLBACK(_on_clicked), pager);
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)
return GDK_FILTER_CONTINUE;
for(i = 0; i < pager->widgets_cnt; i++)
gtk_button_set_relief(GTK_BUTTON(pager->widgets[i]),
i == cur ? GTK_RELIEF_NONE
: GTK_RELIEF_NORMAL);
gtk_widget_set_sensitive(pager->widgets[i], i == cur
? FALSE : TRUE);
return GDK_FILTER_CONTINUE;
}
if(xev->xproperty.atom == pager->atoms[

View File

@ -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
cflags_force=`pkg-config --cflags gtk+-2.0` -fPIC
cflags=-Wall -g -O2 -pedantic
dist=Makefile
[battery]
type=plugin
sources=battery.c
install=$(LIBDIR)/Panel/applets
[battery.c]
depends=../../include/panel.h
[clock]
type=plugin
sources=clock.c
install=$(LIBDIR)/Panel/applets
[clock.c]
depends=../../config.h
depends=../../include/panel.h
[cpu]
type=plugin
@ -18,46 +26,61 @@ sources=cpu.c
install=$(LIBDIR)/Panel/applets
[cpu.c]
depends=../../config.h
depends=../../include/panel.h
[desktop]
type=plugin
sources=desktop.c
install=$(LIBDIR)/Panel/applets
[desktop.c]
depends=../../include/panel.h
[lock]
type=plugin
sources=lock.c
install=$(LIBDIR)/Panel/applets
[lock.c]
depends=../../include/panel.h
[logout]
type=plugin
sources=logout.c
install=$(LIBDIR)/Panel/applets
[logout.c]
depends=../../include/panel.h
[main]
type=plugin
sources=main.c
#cppflags=-D PREFIX=\"$(PREFIX)\"
cppflags=-D PREFIX=\"$(PREFIX)\"
install=$(LIBDIR)/Panel/applets
[main.c]
depends=../../include/panel.h
[memory]
type=plugin
sources=memory.c
install=$(LIBDIR)/Panel/applets
[memory.c]
depends=../../config.h
depends=../../include/panel.h
[pager]
type=plugin
sources=pager.c
install=$(LIBDIR)/Panel/applets
[pager.c]
depends=../../include/panel.h
[tasks]
type=plugin
sources=tasks.c
install=$(LIBDIR)/Panel/applets
[tasks.c]
depends=../../config.h
depends=../../include/panel.h

View File

@ -22,7 +22,6 @@
#include <gdk/gdkx.h>
#include <X11/Xatom.h>
#include "panel.h"
#include "../../config.h"
/* Tasks */
@ -49,11 +48,16 @@ typedef struct _Task
Tasks * tasks;
Window window;
GtkWidget * widget;
GtkWidget * image;
#ifndef EMBEDDED
GtkWidget * label;
#endif
gboolean delete;
} Task;
struct _Tasks
{
PanelAppletHelper * helper;
Task ** tasks;
size_t tasks_cnt;
@ -138,17 +142,32 @@ static Task * _task_new(Tasks * tasks, Window window, char const * name,
GdkPixbuf * pixbuf)
{
Task * task;
GtkWidget * hbox;
if((task = malloc(sizeof(*task))) == NULL)
{
tasks->helper->error(tasks->helper->priv, "malloc", 0);
return NULL;
}
task->tasks = tasks;
task->window = window;
task->widget = gtk_button_new();
task->image = gtk_image_new();
task->delete = FALSE;
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), task->image, FALSE, TRUE, 0);
#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);
#endif
gtk_container_add(GTK_CONTAINER(task->widget), hbox);
g_signal_connect(task->widget, "clicked", G_CALLBACK(_on_clicked),
task);
_task_set(task, name, pixbuf);
@ -167,26 +186,14 @@ static void _task_delete(Task * task)
/* task_set */
static void _task_set(Task * task, char const * name, GdkPixbuf * pixbuf)
{
GtkWidget * image;
#ifndef EMBEDDED
gtk_button_set_label(task->widget, name);
gtk_label_set_text(GTK_LABEL(task->label), name);
#endif
gtk_widget_set_tooltip_text(task->widget, name);
if((image = gtk_button_get_image(GTK_BUTTON(task->widget))) == NULL)
{
if(pixbuf != NULL)
image = gtk_image_new_from_pixbuf(pixbuf);
gtk_image_set_from_pixbuf(GTK_IMAGE(task->image), 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
gtk_image_set_from_stock(GTK_IMAGE(image),
gtk_image_set_from_stock(GTK_IMAGE(task->image),
GTK_STOCK_MISSING_IMAGE,
task->tasks->icon_size);
}
@ -202,6 +209,7 @@ static GtkWidget * _tasks_init(PanelApplet * applet)
if((tasks = malloc(sizeof(*tasks))) == NULL)
return NULL;
applet->priv = tasks;
tasks->helper = applet->helper;
tasks->tasks = NULL;
tasks->tasks_cnt = 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)
{
p = tasks->tasks[i];
#ifndef EMBEDDED
gtk_button_set_label(GTK_BUTTON(p->widget), name);
#endif
_task_set(p, name, pixbuf);
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_box_pack_start(GTK_BOX(tasks->hbox), p->widget, FALSE, TRUE,
0);
#ifdef EMBEDDED
gtk_box_reorder_child(GTK_BOX(tasks->hbox), p->widget, 0);
#endif
}
return 0;
}

View File

@ -26,6 +26,7 @@ typedef struct _Panel Panel;
/* constants */
#define PANEL_BORDER_WIDTH 4
#define PANEL_ICON_SIZE GTK_ICON_SIZE_LARGE_TOOLBAR
/* functions */

View File

@ -56,8 +56,9 @@ struct _Panel
/* prototypes */
/* helpers */
static int _panel_logout_dialog(void);
static void _panel_position_menu(GtkMenu * menu, gint * x, gint * y,
static int _panel_helper_error(void * priv, char const * message, int ret);
static int _panel_helper_logout_dialog(void);
static void _panel_helper_position_menu(GtkMenu * menu, gint * x, gint * y,
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,
&panel->icon_height);
panel->helper.priv = panel;
panel->helper.icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
panel->helper.logout_dialog = _panel_logout_dialog;
panel->helper.position_menu = _panel_position_menu;
panel->helper.error = _panel_helper_error;
panel->helper.icon_size = PANEL_ICON_SIZE;
panel->helper.logout_dialog = _panel_helper_logout_dialog;
panel->helper.position_menu = _panel_helper_position_menu;
/* root window */
panel->root = gdk_screen_get_root_window(
gdk_display_get_default_screen(
@ -132,10 +134,11 @@ static gboolean _on_idle(gpointer data)
Panel * panel = data;
/* FIXME load all plugins, a configuration file or ask the user */
#ifndef EMBEDDED
const char * plugins[] = { "cpu", "clock", "desktop", "lock", "logout",
"main", "memory", "pager", "tasks", NULL };
const char * plugins[] = { "battery", "clock", "cpu", "desktop", "lock",
"logout", "main", "memory", "pager", "tasks", NULL };
#else
const char * plugins[] = { "clock", "desktop", "main", "tasks", NULL };
const char * plugins[] = { "battery", "clock", "desktop", "main",
"tasks", NULL };
#endif
size_t i;
Plugin * plugin;
@ -254,8 +257,17 @@ static int _error_text(char const * message, int ret)
/* private */
/* functions */
/* helpers */
/* panel_logout_dialog */
static int _panel_logout_dialog(void)
/* panel_helper_error */
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;
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 */
static void _panel_position_menu(GtkMenu * menu, gint * x, gint * y,
/* panel_helper_position_menu */
static void _panel_helper_position_menu(GtkMenu * menu, gint * x, gint * y,
gboolean * push_in, gpointer data)
{
Panel * panel = data;
@ -295,7 +307,7 @@ static void _panel_position_menu(GtkMenu * menu, gint * x, gint * y,
if(req.height <= 0)
return;
*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;
*push_in = TRUE;
}