Add a new plugin - kbled: indicator for capslock, numlock, and scrolllock keys.
authorHong Jen Yee (PCMan) <pcman.tw@gmail.com>
Sun, 20 Apr 2008 15:24:38 +0000 (15:24 +0000)
committerHong Jen Yee (PCMan) <pcman.tw@gmail.com>
Sun, 20 Apr 2008 15:24:38 +0000 (15:24 +0000)
17 files changed:
configure.ac
data/Makefile.am
data/images/capslock-off.png [new file with mode: 0644]
data/images/capslock-on.png [new file with mode: 0644]
data/images/numlock-off.png [new file with mode: 0644]
data/images/numlock-on.png [new file with mode: 0644]
data/images/scrllock-off.png [new file with mode: 0644]
data/images/scrllock-on.png [new file with mode: 0644]
po/POTFILES.in
po/fr.po
po/hu.po
po/ko.po
po/pl.po
po/sk.po
po/zh_TW.po
src/plugins/kbled/Makefile.am [new file with mode: 0644]
src/plugins/kbled/kbled.c [new file with mode: 0644]

index 7a56f24..863b596 100644 (file)
@@ -67,13 +67,13 @@ case `$LD -Bsymbolic-functions -v 2>&1 </dev/null` in
   LDFLAGS="$LDFLAGS -Wl,-Bsymbolic-functions"
   AC_MSG_RESULT([yes])
   ;;
-*)                                                                              
+*)
   AC_MSG_RESULT([no])
   ;;
 esac
 AC_MSG_CHECKING([whether $LD accepts --sort-common])
 case `$LD --sort-common -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)                                                                      
+*GNU* | *'with BFD'*)
   LDFLAGS="$LDFLAGS -Wl,--sort-common"
   AC_MSG_RESULT([yes])
   ;;
@@ -146,6 +146,7 @@ plugin_cpu=
 plugin_deskno=
 plugin_batt=
 plugin_xkb=
+plugin_kbled=
 
 AC_MSG_CHECKING([which plugins should be built dynamically])
 AC_ARG_WITH(plugins,
@@ -153,7 +154,7 @@ AC_ARG_WITH(plugins,
 [                         plugins may be comma separated ]
 [                         'all' builds all plugins (default), 'none' builds none ]
 [                         Possible plugins are: ]
-[                         netstatus, netstat, volume, volumealsa, cpu, deskno, batt, xkb], plugins="$withval",[plugins="all"])
+[                         netstatus, netstat, volume, volumealsa, cpu, deskno, batt, kbled, xkb], plugins="$withval",[plugins="all"])
 
 if test x"$plugins" != xall -a x"$plugins" != xnone; then
     if test x"$plugins_loading" = xno; then
@@ -162,7 +163,7 @@ if test x"$plugins" != xall -a x"$plugins" != xnone; then
     fi
 fi
 
-ALL_PLUGINS_LIST="netstatus netstat volume volumealsa cpu deskno batt xkb"
+ALL_PLUGINS_LIST="netstatus netstat volume volumealsa cpu deskno batt kbled xkb"
 AC_SUBST(ALL_PLUGINS_LIST)
 
 if test x"$plugins" = xall; then
@@ -178,6 +179,7 @@ dnl    done
     plugin_cpu=cpu
     plugin_deskno=deskno
     plugin_batt=batt
+    plugin_kbled=kbled
     plugin_xkb=
 
     AC_MSG_RESULT(all)
@@ -208,6 +210,9 @@ else
             batt)
                 plugin_batt=batt
                 ;;
+            kbled)
+                plugin_kbled=kbled
+                ;;
             xkb)
                 plugin_xkb=xkb
                 ;;
@@ -238,14 +243,15 @@ if test x"$compile_libiw" = "xno"; then
    plugin_netstat=
 fi
 PLUGINS_LIST="\
-       $plugin_netstatus \
-       $plugin_netstat \
-       $plugin_volume \
-       $plugin_volumealsa \
-       $plugin_cpu \
-       $plugin_deskno \
-       $plugin_batt \
-       $plugin_xkb"
+    $plugin_netstatus \
+    $plugin_netstat \
+    $plugin_volume \
+    $plugin_volumealsa \
+    $plugin_cpu \
+    $plugin_deskno \
+    $plugin_batt \
+    $plugin_kbled \
+    $plugin_xkb"
 
 AC_SUBST(PLUGINS_LIST)
 
@@ -291,6 +297,7 @@ AC_CONFIG_FILES([
     src/plugins/cpu/Makefile
     src/plugins/deskno/Makefile
     src/plugins/batt/Makefile
+    src/plugins/kbled/Makefile
     src/plugins/xkb/Makefile
     po/Makefile.in
     data/Makefile
@@ -326,6 +333,9 @@ echo Building dynamic plugins:
     if test x"$plugin_batt" != x; then
         AC_MSG_RESULT([    batt - Monitor battery status])
     fi
+    if test x"$plugin_kbled" != x; then
+        AC_MSG_RESULT([    kbled - Indicator for CapsLock, NumLock, and ScrLock])
+    fi
     if test x"$plugin_xkb" != x; then
         AC_MSG_RESULT([    xkb - Keyboard layout switcher])
     fi
index e418038..40522dc 100644 (file)
@@ -47,7 +47,13 @@ lxpanel_images_DATA = \
        images/ns-problem.png \
        images/ns-recvdata.png \
        images/ns-senddata.png \
-       images/ns-lock.png
+       images/ns-lock.png \
+       images/capslock-on.png \
+       images/capslock-off.png \
+       images/numlock-on.png \
+       images/numlock-off.png \
+       images/scrllock-on.png \
+       images/scrllock-off.png
 
 
 lxpanel_imagesdir = $(datadir)/lxpanel/images
diff --git a/data/images/capslock-off.png b/data/images/capslock-off.png
new file mode 100644 (file)
index 0000000..79af584
Binary files /dev/null and b/data/images/capslock-off.png differ
diff --git a/data/images/capslock-on.png b/data/images/capslock-on.png
new file mode 100644 (file)
index 0000000..32e34ed
Binary files /dev/null and b/data/images/capslock-on.png differ
diff --git a/data/images/numlock-off.png b/data/images/numlock-off.png
new file mode 100644 (file)
index 0000000..d93f72b
Binary files /dev/null and b/data/images/numlock-off.png differ
diff --git a/data/images/numlock-on.png b/data/images/numlock-on.png
new file mode 100644 (file)
index 0000000..60db667
Binary files /dev/null and b/data/images/numlock-on.png differ
diff --git a/data/images/scrllock-off.png b/data/images/scrllock-off.png
new file mode 100644 (file)
index 0000000..c37ea17
Binary files /dev/null and b/data/images/scrllock-off.png differ
diff --git a/data/images/scrllock-on.png b/data/images/scrllock-on.png
new file mode 100644 (file)
index 0000000..df42beb
Binary files /dev/null and b/data/images/scrllock-on.png differ
index 43cf201..f9e8505 100644 (file)
@@ -41,3 +41,4 @@ src/plugins/netstatus/netstatus-icon.c
 
 src/plugins/batt/batt.c
 
+src/plugins/kbled/kbled.c
index e9af007..9b1c233 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxpanel-0.2.6\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-04-20 15:09+0800\n"
+"POT-Creation-Date: 2008-04-20 23:19+0800\n"
 "PO-Revision-Date: 2008-05-01 00:00+0100\n"
 "Last-Translator: Frank Endres <frank_endres@yahoo.fr>\n"
 "Language-Team: French\n"
@@ -996,6 +996,14 @@ msgstr "Moniteur des batteries"
 msgid "Display battery status using ACPI"
 msgstr "Afficher l'état de charge des batteries"
 
+#: ../src/plugins/kbled/kbled.c:208
+msgid "Keyboard Led"
+msgstr ""
+
+#: ../src/plugins/kbled/kbled.c:210
+msgid "Indicators for CapsLock, NumLock, and ScrollLock keys"
+msgstr ""
+
 #~ msgid "dynamic"
 #~ msgstr "dynamique"
 
index b0dc9e8..2500b06 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxpanel-0.2.8\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-04-20 15:09+0800\n"
+"POT-Creation-Date: 2008-04-20 23:19+0800\n"
 "PO-Revision-Date: 2008-04-09 17:07+0100\n"
 "Last-Translator: 洪任諭 <pcman.tw@gmail.com>\n"
 "Language-Team: hu <hu@li.org>\n"
@@ -990,6 +990,14 @@ msgstr "Akkumulátor-figyelő"
 msgid "Display battery status using ACPI"
 msgstr "Az ACPI akkumulátor események kijelzése"
 
+#: ../src/plugins/kbled/kbled.c:208
+msgid "Keyboard Led"
+msgstr ""
+
+#: ../src/plugins/kbled/kbled.c:210
+msgid "Indicators for CapsLock, NumLock, and ScrollLock keys"
+msgstr ""
+
 #~ msgid "Center"
 #~ msgstr "Középre"
 
index f496c92..25bd3da 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxpanel 0.1.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-04-20 15:09+0800\n"
+"POT-Creation-Date: 2008-04-20 23:19+0800\n"
 "PO-Revision-Date: 2006-11-27 00:13+0800\n"
 "Last-Translator: 洪任諭 <pcman.tw@gmail.com>\n"
 "Language-Team: GNOME Korean Team <gnome-kr-hackers@lists.kldp.net>\n"
@@ -976,6 +976,14 @@ msgstr "CPU 사용 감시"
 msgid "Display battery status using ACPI"
 msgstr ""
 
+#: ../src/plugins/kbled/kbled.c:208
+msgid "Keyboard Led"
+msgstr ""
+
+#: ../src/plugins/kbled/kbled.c:210
+msgid "Indicators for CapsLock, NumLock, and ScrollLock keys"
+msgstr ""
+
 #~ msgid "dynamic"
 #~ msgstr "가변폭"
 
index 093ae00..e05b2d8 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxpanel-0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-04-20 15:09+0800\n"
+"POT-Creation-Date: 2008-04-20 23:19+0800\n"
 "PO-Revision-Date: 2006-11-27 21:56+0100\n"
 "Last-Translator: Artur Kruszewski <mazdac@gmail.com>\n"
 "Language-Team: Polish\n"
@@ -1002,6 +1002,14 @@ msgstr "Monitor użycia CPU"
 msgid "Display battery status using ACPI"
 msgstr ""
 
+#: ../src/plugins/kbled/kbled.c:208
+msgid "Keyboard Led"
+msgstr ""
+
+#: ../src/plugins/kbled/kbled.c:210
+msgid "Indicators for CapsLock, NumLock, and ScrollLock keys"
+msgstr ""
+
 #, fuzzy
 #~ msgid "Applications"
 #~ msgstr "Wybierz program"
index 6fabd79..b8c067a 100755 (executable)
--- a/po/sk.po
+++ b/po/sk.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxpanel\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-04-20 15:09+0800\n"
+"POT-Creation-Date: 2008-04-20 23:19+0800\n"
 "PO-Revision-Date: 2007-09-17 01:25+0100\n"
 "Last-Translator: Ivan Masár <helix84@centrum.sk>\n"
 "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
@@ -978,6 +978,14 @@ msgstr "Monitor využitia CPU"
 msgid "Display battery status using ACPI"
 msgstr ""
 
+#: ../src/plugins/kbled/kbled.c:208
+msgid "Keyboard Led"
+msgstr ""
+
+#: ../src/plugins/kbled/kbled.c:210
+msgid "Indicators for CapsLock, NumLock, and ScrollLock keys"
+msgstr ""
+
 #~ msgid "Applications"
 #~ msgstr "Aplikácie"
 
index b2af0fc..f3ecf7a 100644 (file)
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-04-20 15:09+0800\n"
-"PO-Revision-Date: 2008-04-18 00:44+0800\n"
+"POT-Creation-Date: 2008-04-20 23:19+0800\n"
+"PO-Revision-Date: 2008-04-20 23:20+0800\n"
 "Last-Translator: 洪任諭 <pcman.tw@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -159,7 +159,8 @@ msgid "Width:"
 msgstr "寬度:"
 
 #. { "configure", N_("Preferences"), configure },
-#: ../src/configurator.c:53 ../src/gtk-run.c:112
+#: ../src/configurator.c:53
+#: ../src/gtk-run.c:112
 msgid "Run"
 msgstr "執行"
 
@@ -179,11 +180,13 @@ msgstr "目前載入的外掛"
 msgid "Stretch"
 msgstr "延展"
 
-#: ../src/configurator.c:495 ../src/panel.c:505
+#: ../src/configurator.c:495
+#: ../src/panel.c:505
 msgid "Add plugin to panel"
 msgstr "新增外掛到工作列"
 
-#: ../src/configurator.c:522 ../src/panel.c:528
+#: ../src/configurator.c:522
+#: ../src/panel.c:528
 msgid "Available plugins"
 msgstr "可選用的外掛"
 
@@ -207,7 +210,8 @@ msgstr "上"
 msgid "Bottom"
 msgstr "下"
 
-#: ../src/panel.c:615 ../src/panel.c:739
+#: ../src/panel.c:615
+#: ../src/panel.c:739
 msgid "Create New Panel"
 msgstr "建立新工作列"
 
@@ -510,9 +514,7 @@ msgid "Task Bar (Window List)"
 msgstr "工作列 (視窗清單)"
 
 #: ../src/plugins/taskbar.c:1606
-msgid ""
-"Taskbar shows all opened windows and allow to iconify them, shade or get "
-"focus"
+msgid "Taskbar shows all opened windows and allow to iconify them, shade or get focus"
 msgstr "工作列顯示所有開啟的視窗,並讓能視窗最小化、折疊、或取得焦點"
 
 #: ../src/plugins/dclock.c:286
@@ -567,7 +569,8 @@ msgstr "切換桌面"
 msgid "Simple pager plugin"
 msgstr "簡易桌面切換外掛"
 
-#: ../src/plugins/space.c:137 ../src/plugins/batt/batt.c:824
+#: ../src/plugins/space.c:137
+#: ../src/plugins/batt/batt.c:824
 msgid "Size"
 msgstr "大小"
 
@@ -654,7 +657,8 @@ msgstr "網路線已拔除"
 msgid "Connection has limited or no connectivity"
 msgstr "只能有限制的連線或無法連線"
 
-#: ../src/plugins/netstat/netstat.c:282 ../src/plugins/netstat/netstat.c:293
+#: ../src/plugins/netstat/netstat.c:282
+#: ../src/plugins/netstat/netstat.c:293
 #: ../src/plugins/netstat/netstat.c:304
 msgid "IP Address:"
 msgstr "IP 位址:"
@@ -663,32 +667,38 @@ msgstr "IP 位址:"
 msgid "Remote IP:"
 msgstr "遠端 IP 位址:"
 
-#: ../src/plugins/netstat/netstat.c:284 ../src/plugins/netstat/netstat.c:295
+#: ../src/plugins/netstat/netstat.c:284
+#: ../src/plugins/netstat/netstat.c:295
 #: ../src/plugins/netstat/netstat.c:306
 msgid "Netmask:"
 msgstr "子網路遮罩:"
 
-#: ../src/plugins/netstat/netstat.c:285 ../src/plugins/netstat/netstat.c:297
+#: ../src/plugins/netstat/netstat.c:285
+#: ../src/plugins/netstat/netstat.c:297
 #: ../src/plugins/netstat/netstat.c:308
 msgid "Activity"
 msgstr "活動"
 
-#: ../src/plugins/netstat/netstat.c:285 ../src/plugins/netstat/netstat.c:297
+#: ../src/plugins/netstat/netstat.c:285
+#: ../src/plugins/netstat/netstat.c:297
 #: ../src/plugins/netstat/netstat.c:308
 msgid "Sent"
 msgstr "已傳送"
 
-#: ../src/plugins/netstat/netstat.c:285 ../src/plugins/netstat/netstat.c:297
+#: ../src/plugins/netstat/netstat.c:285
+#: ../src/plugins/netstat/netstat.c:297
 #: ../src/plugins/netstat/netstat.c:308
 msgid "Received"
 msgstr "已接收"
 
-#: ../src/plugins/netstat/netstat.c:286 ../src/plugins/netstat/netstat.c:298
+#: ../src/plugins/netstat/netstat.c:286
+#: ../src/plugins/netstat/netstat.c:298
 #: ../src/plugins/netstat/netstat.c:309
 msgid "bytes"
 msgstr "位元組"
 
-#: ../src/plugins/netstat/netstat.c:287 ../src/plugins/netstat/netstat.c:299
+#: ../src/plugins/netstat/netstat.c:287
+#: ../src/plugins/netstat/netstat.c:299
 #: ../src/plugins/netstat/netstat.c:310
 msgid "packets"
 msgstr "封包"
@@ -701,11 +711,13 @@ msgstr "無線網路"
 msgid "Protocol:"
 msgstr "通訊協定:"
 
-#: ../src/plugins/netstat/netstat.c:294 ../src/plugins/netstat/netstat.c:305
+#: ../src/plugins/netstat/netstat.c:294
+#: ../src/plugins/netstat/netstat.c:305
 msgid "Boradcast:"
 msgstr "廣播位址:"
 
-#: ../src/plugins/netstat/netstat.c:296 ../src/plugins/netstat/netstat.c:307
+#: ../src/plugins/netstat/netstat.c:296
+#: ../src/plugins/netstat/netstat.c:307
 msgid "HW Address:"
 msgstr "實體位址:"
 
@@ -982,39 +994,38 @@ msgstr "電池電量顯示"
 msgid "Display battery status using ACPI"
 msgstr "透過 ACPI 顯示電池狀態"
 
+#: ../src/plugins/kbled/kbled.c:208
+msgid "Keyboard Led"
+msgstr "鍵盤燈號"
+
+#: ../src/plugins/kbled/kbled.c:210
+msgid "Indicators for CapsLock, NumLock, and ScrollLock keys"
+msgstr "顯示 CapsLock、NumLock、及 ScrollLock 鍵的狀態"
+
 #~ msgid "Applications"
 #~ msgstr "應用程式"
-
 #~ msgid "dynamic"
 #~ msgstr "動態"
-
 #~ msgid "pixels"
 #~ msgstr "像素 (pixels)"
-
 #~ msgid "% of edge"
 #~ msgstr "% 百分比"
-
 #~ msgid "Select a background image file"
 #~ msgstr "選擇背景圖片"
-
 #~ msgid "Appearance"
 #~ msgstr "外觀"
-
 #~ msgid "Plugins"
 #~ msgstr "外掛"
-
 #~ msgid "Center"
 #~ msgstr "置中"
 
 #, fuzzy
 #~ msgid "Logout Command"
 #~ msgstr "登出指令:"
-
 #~ msgid "lxpanel configurator"
 #~ msgstr "lxpanel 偏好設定"
-
 #~ msgid "Background"
 #~ msgstr "背景"
-
 #~ msgid "Update interval (seconds)"
 #~ msgstr "更新頻率 (秒)"
+
diff --git a/src/plugins/kbled/Makefile.am b/src/plugins/kbled/Makefile.am
new file mode 100644 (file)
index 0000000..04c7c3a
--- /dev/null
@@ -0,0 +1,18 @@
+INCLUDES = \
+    -I. \
+    -I$(top_srcdir)/src \
+    -DPACKAGE_DATA_DIR=\""$(datadir)"\" \
+    $(PACKAGE_CFLAGS) \
+    $(G_CAST_CHECKS)
+
+module_LTLIBRARIES = kbled.la
+
+moduledir = $(libdir)/lxpanel/plugins
+
+kbled_la_SOURCES = kbled.c
+
+kbled_la_LIBADD = $(PACKAGE_LIBS)
+
+kbled_la_LDFLAGS = \
+    -module \
+    @LXPANEL_MODULE@
diff --git a/src/plugins/kbled/kbled.c b/src/plugins/kbled/kbled.c
new file mode 100644 (file)
index 0000000..9e55f6e
--- /dev/null
@@ -0,0 +1,217 @@
+/**
+ * Copyright (c) 2006 LxDE Developers, see the file AUTHORS for details.
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+#include <glib/gi18n.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <string.h>
+
+#include <X11/XKBlib.h>
+
+#include "panel.h"
+#include "misc.h"
+#include "plugin.h"
+
+enum {
+    CapsLock = 0,
+    NumLock,
+    ScrlLock
+};
+
+const char* on_icons[]={
+    "capslock-on.png",
+    "numlock-on.png",
+    "scrllock-on.png"
+};
+
+const char* off_icons[]={
+    "capslock-off.png",
+    "numlock-off.png",
+    "scrllock-off.png"
+};
+
+static int old_state = 0;
+
+static int xkb_event_base = 0;
+static int xkb_error_base = 0;
+
+typedef struct _KbLed{
+    GtkWidget *mainw;
+    GtkWidget *img[3];
+    GtkTooltips* tooltips;
+} KbLed;
+
+static void update_display( Plugin* p, unsigned int state )
+{
+    int i;
+    KbLed* kl = (KbLed*)p->priv;
+
+    for( i = 0; i < 3; ++i )
+    {
+        gboolean old = old_state & (1 << i);
+        gboolean cur = state & (1 << i);
+        if( old != cur )
+        {
+            char* file = g_build_filename( PACKAGE_DATA_DIR "/lxpanel/images",
+                                                    cur ? on_icons[i] : off_icons[i], NULL );
+            gtk_image_set_from_file( kl->img[ i ], file );
+            g_free( file );
+        }
+    }
+    old_state = state;
+}
+
+GdkFilterReturn
+event_filter(GdkXEvent *gdkxevent, GdkEvent *event, Plugin* p)
+{
+    XEvent* xev = (XEvent*)gdkxevent;
+    if( xev->xany.type == xkb_event_base + XkbEventCode )
+    {
+        XkbEvent* xkbev = (XkbEvent*)xev;
+        if (xkbev->any.xkb_type == XkbIndicatorStateNotify)
+            update_display(p, xkbev->indicators.state);
+    }
+/*
+    XkbEvent ev;
+    memcpy(&ev.core, gdkxevent, sizeof(ev.core));
+
+    if (ev.core.type == applet->xkbev + XkbEventCode)
+    {
+        if (ev.any.xkb_type == XkbIndicatorStateNotify)
+            ledstates_changed(applet, ev.indicators.state);
+    }
+*/
+    return GDK_FILTER_CONTINUE;
+}
+
+static gboolean on_button_press (GtkWidget* widget, GdkEventButton* evt, Plugin* p)
+{
+    KbLed *kl = (KbLed*)p->priv;
+    if( evt->button == 3 ) { /* Right click*/
+        GtkMenu* popup = lxpanel_get_panel_menu( p->panel, p, FALSE );
+        gtk_menu_popup( popup, NULL, NULL, NULL, NULL, evt->button, evt->time );
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static void kbled_orientation( Plugin* p )
+{
+
+}
+
+static void
+kbled_destructor(Plugin *p)
+{
+    KbLed *kl = (KbLed*)p->priv;
+
+    gdk_window_remove_filter(NULL, (GdkFilterFunc)event_filter, p);
+
+    g_object_unref( kl->tooltips );
+    g_free( kl );
+}
+
+/* Initialize the xkb extension */
+static gboolean init_xkb()
+{
+    int opcode;
+    int maj = XkbMajorVersion;
+    int min = XkbMinorVersion;
+
+    if (!XkbLibraryVersion(&maj, &min))
+        return FALSE;
+    if (!XkbQueryExtension( GDK_DISPLAY(), &opcode, &xkb_event_base, &xkb_error_base, &maj, &min))
+        return FALSE;
+    return TRUE;
+}
+
+static int kbled_constructor(Plugin *p, char **fp)
+{
+    KbLed *kl;
+    line s;
+    GdkPixbuf *icon;
+    GtkWidget *image, *box;
+    GtkIconTheme* theme;
+    GtkIconInfo* info;
+    int i, state;
+
+    if( ! xkb_event_base )  /* if xkb extension is not initialized */
+    {
+        if( G_UNLIKELY( ! init_xkb() ) )
+            return FALSE;
+    }
+    if (!XkbSelectEvents(GDK_DISPLAY(), XkbUseCoreKbd, XkbIndicatorStateNotifyMask, XkbIndicatorStateNotifyMask))
+        return FALSE;
+
+    s.len = 256;
+    kl = g_new0( KbLed, 1);
+    g_return_val_if_fail(kl != NULL, 0);
+    p->priv = kl;
+
+    kl->mainw = gtk_event_box_new();
+    gtk_widget_add_events( kl->mainw, GDK_BUTTON_PRESS_MASK );
+    g_signal_connect( kl->mainw, "button-press-event",
+            G_CALLBACK(on_button_press), p );
+
+    box = p->panel->my_box_new( FALSE, 0 );
+    for( i =0; i < 3; ++i )
+    {
+        image = gtk_image_new();
+        gtk_widget_set_size_request( image, 22, 22 );
+        gtk_box_pack_start( (GtkBox*)box, image, FALSE, FALSE, 0 );
+        kl->img[i] = image;
+    }
+    gtk_container_add( (GtkContainer*)kl->mainw, box );
+
+    XkbGetIndicatorState(GDK_DISPLAY(), XkbUseCoreKbd, &state);
+    old_state = ~state;
+    update_display( p, state );
+
+    /* add event filter to monitor xkb events */
+    gdk_window_add_filter(NULL, (GdkFilterFunc)event_filter, p );
+
+    gtk_widget_show_all(kl->mainw);
+    kl->tooltips = g_object_ref( p->panel->tooltips );
+    //gtk_tooltips_set_tip (vol->tooltips, vol->mainw, _("Volume control"), NULL);
+    p->pwid = kl->mainw;
+
+    return TRUE;
+}
+
+
+PluginClass kbled_plugin_class = {
+    fname: NULL,
+    count: 0,
+
+    type : "kbled",
+    name : N_("Keyboard Led"),
+    version: "1.0",
+    description : N_("Indicators for CapsLock, NumLock, and ScrollLock keys"),
+
+    constructor : kbled_constructor,
+    destructor  : kbled_destructor,
+    config : NULL,
+    save : NULL,
+    orientation : kbled_orientation
+};