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/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 \
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
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 <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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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[
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
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);
|
||||
if(pixbuf != NULL)
|
||||
gtk_image_set_from_pixbuf(GTK_IMAGE(task->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;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ typedef struct _Panel Panel;
|
|||
|
||||
/* constants */
|
||||
#define PANEL_BORDER_WIDTH 4
|
||||
#define PANEL_ICON_SIZE GTK_ICON_SIZE_LARGE_TOOLBAR
|
||||
|
||||
|
||||
/* functions */
|
||||
|
|
38
src/panel.c
38
src/panel.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user