mirror of
https://github.com/KeithDHedger/LFSDesktopProject.git
synced 2025-08-01 16:08:29 +00:00
First commit of lfsdock
This commit is contained in:
2
LFSDock/ChangeLog
Normal file
2
LFSDock/ChangeLog
Normal file
@ -0,0 +1,2 @@
|
||||
0.1.0
|
||||
First commit of lfsdock.
|
14
LFSDock/LFSDock/app/Makefile.am
Normal file
14
LFSDock/LFSDock/app/Makefile.am
Normal file
@ -0,0 +1,14 @@
|
||||
AUTOMAKE_OPTIONS = subdir-objects
|
||||
|
||||
include ../flagsandlibs
|
||||
include ../sources
|
||||
|
||||
lfsdock_SOURCES = $(COMMONSRC)
|
||||
|
||||
man1_MANS = ../resources/man/lfsdock.1
|
||||
|
||||
#pixfilesdir = $(pkgdatadir)/pixmaps
|
||||
#pixfiles_DATA = ../resources/pixmaps/*
|
||||
|
||||
bin_PROGRAMS = lfsdock
|
||||
|
23
LFSDock/LFSDock/flagsandlibs
Normal file
23
LFSDock/LFSDock/flagsandlibs
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir) \
|
||||
$(ALSA_CFLAGS) \
|
||||
$(X11_CFLAGS) \
|
||||
$(XFT_CFLAGS) \
|
||||
$(LIBGLIB_CFLAGS) \
|
||||
$(CAIRO_CFLAGS) \
|
||||
$(LFSTK_CFLAGS) \
|
||||
$(LIBGLIB_CFLAGS) \
|
||||
-DPREFIX=\""${prefix}\"" \
|
||||
-DDATADIR=\""${pkgdatadir}"\" \
|
||||
-DSYSCONFDIR=\""${sysconfdir}/${PACKAGE}"\" \
|
||||
-DLIBDIR=\""${libdir}/${PACKAGE}"\"
|
||||
|
||||
LIBS = $(X11_LIBS) \
|
||||
$(ALSA_LIBS) \
|
||||
$(XFT_LIBS) \
|
||||
$(LIBGLIB_LIBS) \
|
||||
$(CAIRO_LIBS) \
|
||||
$(LFSTK_LIBS) \
|
||||
$(LIBGLIB_LIBS) \
|
||||
-lm
|
||||
|
94
LFSDock/LFSDock/resources/man/lfsdock.1
Normal file
94
LFSDock/LFSDock/resources/man/lfsdock.1
Normal file
@ -0,0 +1,94 @@
|
||||
.TH "lfspanel" "1" "0.0.5" "K.D.Hedger" "User Commands"
|
||||
.SH "NAME"
|
||||
\fBlfspanel\fR - Manual page for lfspanel.
|
||||
.br
|
||||
.SH "SYNOPSIS"
|
||||
\fBlfspanel\fR PANELID
|
||||
.br
|
||||
|
||||
.SH "DESCRIPTION"
|
||||
Part of the LFS Desktop project here:
|
||||
.br
|
||||
|
||||
http://www.linuxquestions.org/questions/linux-from-scratch-13/the-linux-from-scratch-desktop-project-4175542914
|
||||
.br
|
||||
|
||||
This provides basic panel functionality, logout, shutdown, app menu, window menu etc etc.
|
||||
.br
|
||||
.SH "EXAMPLES"
|
||||
Start new main panel using config file ~/.config/LFS/lfspanel.rc
|
||||
.br
|
||||
lfspanel
|
||||
.br
|
||||
|
||||
Start new panel using config file ~/.config/LFS/lfspanel-0.rc
|
||||
.br
|
||||
lfspanel 0
|
||||
.br
|
||||
|
||||
Start new panel using config file ~/.config/LFS/lfspanel-DEV.rc
|
||||
.br
|
||||
lfspanel DEV
|
||||
.br
|
||||
|
||||
.SH "FILES"
|
||||
Sample rc file:
|
||||
.br
|
||||
|
||||
panelheight 16
|
||||
.br
|
||||
panelwidth -1
|
||||
.br
|
||||
panelpos -2
|
||||
.br
|
||||
panelgrav 4
|
||||
.br
|
||||
onmonitor 0
|
||||
.br
|
||||
termcommand xfce4-terminal -x
|
||||
.br
|
||||
logoutcommand kill -9 $(cat /tmp/lfssession.pid)
|
||||
.br
|
||||
restartcommand sudo reboot
|
||||
.br
|
||||
shutdowncommand sudo shutdown -h now
|
||||
.br
|
||||
gadgetsright MDCL
|
||||
.br
|
||||
gadgetsleft AWSS
|
||||
.br
|
||||
|
||||
panelheight - Height of panel.
|
||||
.br
|
||||
panelwidth - Can be -1 for full width of monitor, -2 shrink to fit or >0 for absolute size.
|
||||
.br
|
||||
panelpos - Can be -1 for left position, -2 for centre position, -3 for right position or >=0 for absolute position.
|
||||
.br
|
||||
panelgrav - Canbe 1 for top of monitor, 2 for right of monitor, 3 for bottom of monitor, 4 for left of monitor.
|
||||
.br
|
||||
onmonitor - Monitor for this panel.
|
||||
.br
|
||||
termcommand - Command to use when launching app in terminal, defaults to "xterm -e".
|
||||
.br
|
||||
logoutcommand
|
||||
.br
|
||||
restartcommand
|
||||
.br
|
||||
shutdowncommand - Set to your prefs.
|
||||
.br
|
||||
gadgetsright
|
||||
.br
|
||||
gadgetsleft - Position of gadgets in panel in order L=logout menu, C=clock, D=disk usage, M=cpu load, A=applications menu, W=all window's selector, w=windows on current desktop selector, S=spacer, l=launchers.
|
||||
.br
|
||||
|
||||
When using the 'l' widget all .desktop files in the folder ~/.config/LFS/launchers-XXX will be added to the panel, where XXX is the panel ID, the same as the prefs file, see the examples section.
|
||||
.br
|
||||
|
||||
For an empty gadget string for gadgetsright/gadgetsleft use "", else "'s are not needed. Only one gadget of each type is allowed except for spacers which can be used multiple times.
|
||||
.br
|
||||
|
||||
Clock, disk usage and CPU usage are not allowed on left/right panels.
|
||||
.br
|
||||
.SH "REPORTING BUGS"
|
||||
Report bugs to keithdhedger@gmail.com
|
||||
.br
|
1
LFSDock/LFSDock/sources
Normal file
1
LFSDock/LFSDock/sources
Normal file
@ -0,0 +1 @@
|
||||
COMMONSRC = ../src/appmenu.cpp ../src/callbacks.cpp ../src/clock.cpp ../src/cpu.cpp ../src/disks.cpp ../src/globals.cpp ../src/launchers.cpp ../src/logout.cpp ../src/main.cpp ../src/slider.cpp ../src/windowlist.cpp
|
117
LFSDock/LFSDock/src/callbacks.cpp
Normal file
117
LFSDock/LFSDock/src/callbacks.cpp
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Sat 6 Feb 13:59:35 GMT 2021 keithdhedger@gmail.com
|
||||
|
||||
* This file (callbacks.cpp) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
bool launcherCB(void *p,void* ud)
|
||||
{
|
||||
launcherList *launcher=(launcherList*)ud;
|
||||
char *command;
|
||||
|
||||
if(launcher==NULL)
|
||||
return(true);
|
||||
|
||||
if(launcher->entry.inTerm==false)
|
||||
asprintf(&command,"%s &",launcher->entry.exec);
|
||||
else
|
||||
asprintf(&command,"%s %s &",prefs.LFSTK_getCString("termcommand"),launcher->entry.exec);
|
||||
|
||||
sendNotify("Launching ",launcher->entry.name);
|
||||
#ifdef _ENABLEDEBUG_
|
||||
DEBUGFUNC("%s",command);
|
||||
#else
|
||||
system(command);
|
||||
#endif
|
||||
free(command);
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool gadgetDrop(void *lwc,propertyStruct *data,void* ud)
|
||||
{
|
||||
launcherList *launcher=(launcherList*)ud;
|
||||
char *command=NULL;
|
||||
|
||||
if(data!=NULL)
|
||||
{
|
||||
if(strcasecmp(data->mimeType,"text/uri-list")==0)
|
||||
{
|
||||
dropDesktopFile((const char*)data->data,launcher);
|
||||
return(true);
|
||||
}
|
||||
|
||||
if(strcasecmp(data->mimeType,"text/plain")==0)
|
||||
{
|
||||
std::istringstream stream((const char*)data->data);
|
||||
std::string line;
|
||||
while(std::getline(stream,line))
|
||||
{
|
||||
if(launcher->entry.inTerm==false)
|
||||
asprintf(&command,"%s \"%s\" &",launcher->entry.exec,line.c_str());
|
||||
else
|
||||
asprintf(&command,"%s %s \"%s\" &",prefs.LFSTK_getCString("termcommand"),launcher->entry.exec,line.c_str());
|
||||
sendNotify(launcher->entry.name,line.c_str());
|
||||
system(command);
|
||||
free(command);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool timerCB(LFSTK_applicationClass *p,void* ud)
|
||||
{
|
||||
Window sink;
|
||||
Window childwindow;
|
||||
int sinkx;
|
||||
int sinky;
|
||||
unsigned int buttonmask;
|
||||
|
||||
XQueryPointer(apc->display,apc->rootWindow,&sink,&childwindow,&sinkx,&sinky,&sinkx,&sinky,&buttonmask);
|
||||
|
||||
if(buttonmask!=0)
|
||||
return(true);
|
||||
|
||||
readMsg();
|
||||
|
||||
if(clockButton!=NULL)
|
||||
updateClock();
|
||||
|
||||
if(scwindow!=NULL)
|
||||
updateSlider();
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
#define DOCK_MSG 2000
|
||||
|
||||
void readMsg(void)
|
||||
{
|
||||
int retcode;
|
||||
|
||||
buffer.mText[0]=0;
|
||||
retcode=msgrcv(queueID,&buffer,MAX_MSG_SIZE,DOCK_MSG,IPC_NOWAIT);
|
||||
|
||||
if(strcmp(buffer.mText,"quitdock")==0)
|
||||
{
|
||||
apc->mainLoop=false;
|
||||
realMainLoop=false;
|
||||
}
|
||||
buffer.mText[0]=0;
|
||||
}
|
29
LFSDock/LFSDock/src/callbacks.h
Normal file
29
LFSDock/LFSDock/src/callbacks.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Sat 6 Feb 13:59:29 GMT 2021 keithdhedger@gmail.com
|
||||
|
||||
* This file (callbacks.h) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _CALLBACKS_
|
||||
#define _CALLBACKS_
|
||||
|
||||
bool launcherCB(void *p,void* ud);
|
||||
bool gadgetDrop(void *lwc,propertyStruct *data,void* ud);
|
||||
bool timerCB(LFSTK_applicationClass *p,void* ud);
|
||||
void readMsg(void);
|
||||
|
||||
#endif
|
69
LFSDock/LFSDock/src/clock.cpp
Normal file
69
LFSDock/LFSDock/src/clock.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Mon 21 Sep 13:41:36 BST 2015 keithdhedger@gmail.com
|
||||
|
||||
* This file (clock.cpp) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <ctime>
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
LFSTK_labelClass *clockButton=NULL;
|
||||
|
||||
void updateClock(void)
|
||||
{
|
||||
char clockbuffer[256];
|
||||
time_t rawtime;
|
||||
struct tm *timeinfo;
|
||||
|
||||
time(&rawtime);
|
||||
timeinfo=localtime(&rawtime);
|
||||
|
||||
strftime(clockbuffer,255,"%I:%M:%S",timeinfo);
|
||||
clockButton->LFSTK_setLabel(clockbuffer);
|
||||
}
|
||||
|
||||
int addClock(int x,int y,int grav)
|
||||
{
|
||||
int xpos=0;
|
||||
int width=BWIDTH;
|
||||
int retval=width;
|
||||
|
||||
if((panelGravity==PANELEAST) || (panelGravity==PANELWEST))
|
||||
{
|
||||
printError("Clock not allowed with this panel's orientation.");
|
||||
return(0);
|
||||
}
|
||||
|
||||
if(clockButton!=NULL)
|
||||
{
|
||||
printError("Duplicate clock");
|
||||
return(0);
|
||||
}
|
||||
if(grav==NorthWestGravity)
|
||||
xpos=x;
|
||||
else
|
||||
xpos=x-width;
|
||||
|
||||
clockButton=new LFSTK_labelClass(mainwind,"--:--:--",xpos,0,width,panelHeight,CENTRE,grav);
|
||||
|
||||
setGadgetDetails(clockButton);
|
||||
|
||||
return(retval);
|
||||
}
|
30
LFSDock/LFSDock/src/clock.h
Normal file
30
LFSDock/LFSDock/src/clock.h
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Mon 21 Sep 13:41:31 BST 2015 keithdhedger@gmail.com
|
||||
|
||||
* This file (clock.h) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _CLOCK_
|
||||
#define _CLOCK_
|
||||
|
||||
extern LFSTK_labelClass *clockButton;
|
||||
|
||||
int addClock(int x,int y,int grav);
|
||||
void updateClock(void);
|
||||
|
||||
#endif
|
175
LFSDock/LFSDock/src/globals.cpp
Normal file
175
LFSDock/LFSDock/src/globals.cpp
Normal file
@ -0,0 +1,175 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Sun 20 Sep 14:41:10 BST 2015 keithdhedger@gmail.com
|
||||
|
||||
* This file (globals.cpp) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
//prefs
|
||||
LFSTK_prefsClass prefs;
|
||||
/*
|
||||
{prefs.LFSTK_hashFromKey("usetheme"),{TYPEBOOL,"usetheme","",useTheme->LFSTK_getValue(),0}},
|
||||
{prefs.LFSTK_hashFromKey("panelcolour"),{TYPESTRING,"panelcolour",panelColourEdit->LFSTK_getCStr(),false,0}},
|
||||
|
||||
*/
|
||||
int panelHeight=16;
|
||||
int panelWidth=-1;
|
||||
const monitorStruct *mons=NULL;
|
||||
int onMonitor=0;
|
||||
int panelPos=PANELCENTRE;
|
||||
int panelGravity=PANELNORTH;
|
||||
bool useTheme=true;
|
||||
const char *panelColour="";
|
||||
const char *panelTextColour="";
|
||||
bool noButtons=false;
|
||||
|
||||
int queueID;
|
||||
msgBuffer buffer;
|
||||
|
||||
const char *desktopTheme=NULL;
|
||||
// char *panelID="";
|
||||
bool realMainLoop=true;
|
||||
|
||||
int refreshRate=1;
|
||||
|
||||
int iconSize=16;
|
||||
|
||||
//panel window
|
||||
LFSTK_applicationClass *apc=NULL;
|
||||
LFSTK_windowClass *mainwind=NULL;
|
||||
int rightOffset=0;
|
||||
int leftOffset=0;
|
||||
int launcherSide=NOLAUNCHERS;
|
||||
|
||||
//atoms
|
||||
Atom WM_STATE=None;
|
||||
Atom NET_WM_WINDOW_TYPE_NORMAL=None;
|
||||
Atom NET_WM_STATE_HIDDEN=None;
|
||||
Atom NET_WM_WINDOW_TYPE_DIALOG=None;
|
||||
Atom NET_WM_DESKTOP=None;
|
||||
Atom NET_WM_WINDOW_TYPE=None;
|
||||
Atom NET_WM_STATE=None;
|
||||
Atom NET_WM_NAME=None;
|
||||
Atom UTF8_STRING=None;
|
||||
|
||||
const char *possibleError="Unknown";
|
||||
|
||||
void setSizes(int *x,int *y,int *w,int *h,int *size,int *grav,bool fromleft)
|
||||
{
|
||||
*w=panelHeight;
|
||||
*h=panelHeight;
|
||||
*size=(*w)-12;
|
||||
|
||||
switch(*grav)
|
||||
{
|
||||
case PANELNORTH:
|
||||
case PANELSOUTH:
|
||||
if(fromleft==true)
|
||||
{
|
||||
*grav=NorthWestGravity;
|
||||
*x=*x;
|
||||
}
|
||||
else
|
||||
{
|
||||
*grav=NorthEastGravity;
|
||||
*x=*x-*w+1;
|
||||
}
|
||||
*y=0;
|
||||
break;
|
||||
|
||||
case PANELEAST:
|
||||
case PANELWEST:
|
||||
if(fromleft==true)
|
||||
{
|
||||
*grav=NorthWestGravity;
|
||||
*y=*x;
|
||||
}
|
||||
else
|
||||
{
|
||||
*grav=SouthWestGravity;
|
||||
*y=*x-*h+1;
|
||||
}
|
||||
*x=0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sendNotify(const char *name,const char *message)//TODO//could be better
|
||||
{
|
||||
#ifdef _GOTNOTIFYSEND_
|
||||
char *command;
|
||||
asprintf(&command,"notify-send -u low -t 2000 -i stock_dialog-info \"%s\" \"%s ...\" &",name,message);
|
||||
system(command);
|
||||
free(command);
|
||||
#endif
|
||||
}
|
||||
|
||||
void dropDesktopFile(const char *data,launcherList *launcher)
|
||||
{
|
||||
char *cleanstr;
|
||||
char *command=NULL;
|
||||
char *ptr;
|
||||
std::istringstream stream(data);
|
||||
std::string line;
|
||||
while(std::getline(stream,line))
|
||||
{
|
||||
cleanstr=apc->globalLib->LFSTK_cleanString((const char*)line.c_str());
|
||||
if((strrchr(cleanstr,'.')!=NULL) && (strcmp(strrchr(cleanstr,'.'),".desktop")==0))
|
||||
{
|
||||
asprintf(&command,"mkdir -p '%s/launchers-DOCK';cp -nP '%s' '%s/launchers-DOCK'",apc->configDir,cleanstr,apc->configDir);
|
||||
ptr=strrchr(cleanstr,'/');
|
||||
sendNotify("Adding launcher ",++ptr);
|
||||
system(command);
|
||||
free(command);
|
||||
apc->exitValue=0;
|
||||
apc->mainLoop=false;
|
||||
free(cleanstr);
|
||||
return;
|
||||
}
|
||||
|
||||
if(launcher!=NULL)
|
||||
{
|
||||
if(launcher->entry.inTerm==false)
|
||||
asprintf(&command,"%s \"%s\" &",launcher->entry.exec,cleanstr);
|
||||
else
|
||||
asprintf(&command,"%s %s \"%s\" &",prefs.LFSTK_getCString("termcommand"),launcher->entry.exec,cleanstr);
|
||||
sendNotify("Running ",launcher->entry.exec);
|
||||
system(command);
|
||||
free(cleanstr);
|
||||
free(command);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setGadgetDetails(LFSTK_gadgetClass *gadget)
|
||||
{
|
||||
if(useTheme==false)
|
||||
{
|
||||
gadget->LFSTK_setAlpha(1.0);
|
||||
gadget->LFSTK_setTile(NULL,0);
|
||||
gadget->LFSTK_setColourName(NORMALCOLOUR,panelColour);
|
||||
gadget->LFSTK_setFontColourName(NORMALCOLOUR,panelTextColour,true);
|
||||
if(noButtons==true)
|
||||
{
|
||||
gadget->gadgetDetails.bevel=BEVELNONE;
|
||||
gadget->LFSTK_setColourName(PRELIGHTCOLOUR,panelColour);
|
||||
gadget->LFSTK_setColourName(ACTIVECOLOUR,panelColour);
|
||||
gadget->LFSTK_setColourName(INACTIVECOLOUR,panelColour);
|
||||
}
|
||||
}
|
||||
}
|
117
LFSDock/LFSDock/src/globals.h
Normal file
117
LFSDock/LFSDock/src/globals.h
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Sun 20 Sep 14:41:04 BST 2015 keithdhedger@gmail.com
|
||||
|
||||
* This file (globals.h) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
|
||||
#include "config.h"
|
||||
#include <lfstk/LFSTKGlobals.h>
|
||||
|
||||
#include "callbacks.h"
|
||||
#include "clock.h"
|
||||
#include "slider.h"
|
||||
|
||||
#ifndef _GLOBALS_
|
||||
#define _GLOBALS_
|
||||
|
||||
#define WINHELPER DATADIR "/scripts/PanelHelperWinList"
|
||||
#define BWIDTH 64
|
||||
#define SPACING 10
|
||||
#define WINDOWREFRESH 2
|
||||
#define RCNAME "lfsdock"
|
||||
#define REFRESHMULTI 4
|
||||
|
||||
enum PANELXPOS {PANELLEFT=-1,PANELCENTRE=-2,PANELRIGHT=-3};
|
||||
enum PANELYPOS {PANELTOP=-1,PANELBOTTOM=-3};
|
||||
enum PANELSIZE {PANELFULL=-1,PANELSHRINK=-2};
|
||||
enum PANELGRAVITY {PANELABS=0,PANELNORTH,PANELEAST,PANELSOUTH,PANELWEST};
|
||||
|
||||
struct menuEntryStruct
|
||||
{
|
||||
char *name=NULL;
|
||||
char *exec=NULL;
|
||||
char *icon=NULL;
|
||||
bool inTerm;
|
||||
};
|
||||
|
||||
struct launcherList
|
||||
{
|
||||
launcherList *next=NULL;
|
||||
LFSTK_buttonClass *bc=NULL;
|
||||
char *icon=NULL;
|
||||
menuEntryStruct entry;
|
||||
};
|
||||
|
||||
enum {NOLAUNCHERS,LAUNCHERINLEFT,LAUNCHERINRITE};
|
||||
|
||||
//prefs
|
||||
extern LFSTK_prefsClass prefs;
|
||||
|
||||
extern int panelHeight;
|
||||
extern int panelWidth;
|
||||
extern const monitorStruct *mons;
|
||||
extern int onMonitor;
|
||||
extern int panelPos;
|
||||
extern int panelGravity;
|
||||
extern bool useTheme;
|
||||
extern const char *panelColour;
|
||||
extern const char *panelTextColour;
|
||||
extern bool noButtons;
|
||||
|
||||
extern int queueID;
|
||||
extern msgBuffer buffer;
|
||||
extern bool realMainLoop;
|
||||
|
||||
extern const char *desktopTheme;
|
||||
// const char *panelID;
|
||||
|
||||
extern int refreshRate;
|
||||
|
||||
extern int iconSize;
|
||||
|
||||
//panel window
|
||||
extern LFSTK_applicationClass *apc;
|
||||
extern LFSTK_windowClass *mainwind;
|
||||
extern int rightOffset;
|
||||
extern int leftOffset;
|
||||
extern int launcherSide;
|
||||
|
||||
//atoms
|
||||
extern Atom WM_STATE;
|
||||
extern Atom NET_WM_WINDOW_TYPE_NORMAL;
|
||||
extern Atom NET_WM_STATE_HIDDEN;
|
||||
extern Atom NET_WM_WINDOW_TYPE_DIALOG;
|
||||
extern Atom NET_WM_DESKTOP;
|
||||
extern Atom NET_WM_WINDOW_TYPE;
|
||||
extern Atom NET_WM_STATE;
|
||||
extern Atom NET_WM_NAME;
|
||||
extern Atom UTF8_STRING;
|
||||
|
||||
extern const char *possibleError;
|
||||
|
||||
void printError(const char *err);
|
||||
void setSizes(int *x,int *y,int *w,int *h,int *size,int *grav,bool fromleft);
|
||||
void dropDesktopFile(const char *data,launcherList *launcher);
|
||||
void sendNotify(const char *message1,const char *message2);
|
||||
void setGadgetDetails(LFSTK_gadgetClass *gadget);
|
||||
|
||||
#endif
|
172
LFSDock/LFSDock/src/launchers.cpp
Normal file
172
LFSDock/LFSDock/src/launchers.cpp
Normal file
@ -0,0 +1,172 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Wed 28 Oct 19:47:41 GMT 2015 keithdhedger@gmail.com
|
||||
|
||||
* This file (launchers.cpp) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <ftw.h>
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
#include <glib.h>
|
||||
|
||||
#include "launchers.h"
|
||||
|
||||
launcherList *ll=NULL;
|
||||
|
||||
void addALAuncher(const char *fpath,menuEntryStruct *entry)
|
||||
{
|
||||
size_t start_pos=0;
|
||||
std::string from;
|
||||
std::string str;
|
||||
bool goodkey;
|
||||
GKeyFile *kf=g_key_file_new();
|
||||
char *execstring;
|
||||
|
||||
entry->icon=NULL;
|
||||
entry->name=NULL;
|
||||
entry->exec=NULL;
|
||||
entry->inTerm=false;
|
||||
|
||||
goodkey=g_key_file_load_from_file(kf,fpath,G_KEY_FILE_NONE,NULL);
|
||||
if(goodkey==true)
|
||||
{
|
||||
entry->name=g_key_file_get_string(kf,"Desktop Entry",G_KEY_FILE_DESKTOP_KEY_NAME,NULL);
|
||||
entry->icon=g_key_file_get_string(kf,"Desktop Entry",G_KEY_FILE_DESKTOP_KEY_ICON,NULL);
|
||||
entry->inTerm=g_key_file_get_boolean(kf,"Desktop Entry",G_KEY_FILE_DESKTOP_KEY_TERMINAL,NULL);
|
||||
execstring=g_key_file_get_string(kf,"Desktop Entry",G_KEY_FILE_DESKTOP_KEY_EXEC,NULL);
|
||||
str=execstring;
|
||||
from="%f";
|
||||
while((start_pos=str.find(from,start_pos))!=std::string::npos)
|
||||
str.replace(start_pos, from.length(),"");
|
||||
from="%U";
|
||||
start_pos=0;
|
||||
while((start_pos=str.find(from,start_pos))!=std::string::npos)
|
||||
str.replace(start_pos, from.length(),"");
|
||||
entry->exec=strdup(str.c_str());
|
||||
free(execstring);
|
||||
}
|
||||
g_key_file_free(kf);
|
||||
}
|
||||
|
||||
int launcherBuildCB(const char *fpath,const struct stat *sb,int typeflag)
|
||||
{
|
||||
menuEntryStruct entry;
|
||||
char *icon=NULL;
|
||||
launcherList *newlist=NULL;
|
||||
launcherList *looplist=NULL;
|
||||
|
||||
if(typeflag!=FTW_F)
|
||||
return(0);
|
||||
|
||||
entry.icon=NULL;
|
||||
entry.name=NULL;
|
||||
entry.exec=NULL;
|
||||
entry.inTerm=false;
|
||||
|
||||
addALAuncher(fpath,&entry);
|
||||
|
||||
if((entry.name!=NULL) && (entry.exec!=NULL))
|
||||
{
|
||||
newlist=new launcherList;
|
||||
newlist->entry=entry;
|
||||
newlist->next=NULL;
|
||||
newlist->bc=NULL;
|
||||
newlist->icon=entry.icon;
|
||||
if(ll!=NULL)
|
||||
{
|
||||
looplist=ll;
|
||||
while(looplist->next!=NULL)
|
||||
looplist=looplist->next;
|
||||
looplist->next=newlist;
|
||||
}
|
||||
else
|
||||
ll=newlist;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(entry.name!=NULL)
|
||||
free(entry.name);
|
||||
if(entry.exec!=NULL)
|
||||
free(entry.exec);
|
||||
if(entry.icon!=NULL)
|
||||
free(entry.icon);
|
||||
if(icon!=NULL)
|
||||
free(icon);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
int addLaunchers(int x,int y,int grav,bool fromleft)
|
||||
{
|
||||
char *launchers;
|
||||
launcherList *loopll;
|
||||
ll=NULL;
|
||||
char *icon=NULL;
|
||||
int xpos=x;
|
||||
int ypos=y;
|
||||
int width=0;
|
||||
int height=0;
|
||||
int thisgrav=grav;
|
||||
int iconsize=16;
|
||||
int maxwidth=0;
|
||||
int sx,sy;
|
||||
|
||||
asprintf(&launchers,"%s/launchers-DOCK",apc->configDir);
|
||||
ftw(launchers,launcherBuildCB,16);
|
||||
|
||||
setSizes(&xpos,&ypos,&width,&height,&iconsize,&thisgrav,fromleft);
|
||||
maxwidth=width;
|
||||
sx=xpos;
|
||||
sy=ypos;
|
||||
|
||||
loopll=ll;
|
||||
while(loopll!=NULL)
|
||||
{
|
||||
icon=NULL;
|
||||
loopll->bc=new LFSTK_buttonClass(mainwind,"",sx,sy,width,height,thisgrav);
|
||||
loopll->bc->LFSTK_setMouseCallBack(NULL,launcherCB,(void*)loopll);
|
||||
loopll->bc->LFSTK_setGadgetDropCallBack(gadgetDrop,(void*)loopll);
|
||||
loopll->bc->gadgetAcceptsDnD=true;
|
||||
|
||||
if((loopll->icon!=NULL) && (desktopTheme!=NULL))
|
||||
icon=apc->globalLib->LFSTK_findThemedIcon(desktopTheme,loopll->icon,"");
|
||||
if(icon!=NULL)
|
||||
loopll->bc->LFSTK_setImageFromPath(icon,LEFT,true);
|
||||
else
|
||||
loopll->bc->LFSTK_setImageFromPath(DATADIR "/pixmaps/command.png",LEFT,true);
|
||||
|
||||
setGadgetDetails(loopll->bc);
|
||||
|
||||
if(icon!=NULL)
|
||||
free(icon);
|
||||
loopll=loopll->next;
|
||||
if((grav==PANELNORTH) || (grav==PANELSOUTH))
|
||||
{
|
||||
if(fromleft==false)
|
||||
sx-=width;
|
||||
else
|
||||
sx+=width;
|
||||
}
|
||||
else
|
||||
sy+=height;
|
||||
maxwidth+=width;
|
||||
}
|
||||
free(launchers);
|
||||
|
||||
return(maxwidth-width);
|
||||
}
|
31
LFSDock/LFSDock/src/launchers.h
Normal file
31
LFSDock/LFSDock/src/launchers.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Wed 28 Oct 19:47:48 GMT 2015 keithdhedger@gmail.com
|
||||
|
||||
* This file (launchers.h) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _LAUNCHERS_
|
||||
#define _LAUNCHERS_
|
||||
|
||||
#include "globals.h"
|
||||
#include "callbacks.h"
|
||||
|
||||
extern launcherList *ll;
|
||||
|
||||
int addLaunchers(int x,int y,int grav,bool fromleft);
|
||||
|
||||
#endif
|
298
LFSDock/LFSDock/src/main.cpp
Normal file
298
LFSDock/LFSDock/src/main.cpp
Normal file
@ -0,0 +1,298 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Mon 7 Sep 13:20:24 BST 2015 keithdhedger@gmail.com
|
||||
|
||||
* This file (lfswmprefs.cpp) is part of LFSApplications.
|
||||
|
||||
* LFSApplications 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 3 of the License,or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSApplications 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 LFSApplications. If not,see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/msg.h>
|
||||
|
||||
#include "globals.h"
|
||||
#include "clock.h"
|
||||
#include "launchers.h"
|
||||
#include "slider.h"
|
||||
|
||||
#define RCNAME "lfsdock"
|
||||
#define REFRESHMULTI 4
|
||||
|
||||
void loadPrefs(const char *env)
|
||||
{
|
||||
prefs.LFSTK_loadVarsFromFile(env);
|
||||
panelHeight=prefs.LFSTK_getInt(prefs.LFSTK_hashFromKey("panelheight"));
|
||||
panelWidth=prefs.LFSTK_getInt(prefs.LFSTK_hashFromKey("panelwidth"));
|
||||
onMonitor=prefs.LFSTK_getInt(prefs.LFSTK_hashFromKey("onmonitor"));
|
||||
panelPos=prefs.LFSTK_getInt(prefs.LFSTK_hashFromKey("panelpos"));
|
||||
panelGravity=prefs.LFSTK_getInt(prefs.LFSTK_hashFromKey("panelgrav"));
|
||||
useTheme=prefs.LFSTK_getBool(prefs.LFSTK_hashFromKey("usetheme"));
|
||||
panelColour=prefs.LFSTK_getCString(prefs.LFSTK_hashFromKey("panelcolour"));
|
||||
panelTextColour=prefs.LFSTK_getCString(prefs.LFSTK_hashFromKey("textcolour"));
|
||||
noButtons=prefs.LFSTK_getBool(prefs.LFSTK_hashFromKey("nobuttons"));
|
||||
}
|
||||
|
||||
void addLeftGadgets(void)
|
||||
{
|
||||
int offset=leftOffset;
|
||||
|
||||
for(int j=0; j<prefs.LFSTK_getStringObject("gadgetsleft")->length();j++)
|
||||
{
|
||||
switch(prefs.LFSTK_getStringObject("gadgetsleft")->at(j))
|
||||
{
|
||||
case 'C':
|
||||
offset+=addClock(offset,mons->y,NorthWestGravity);
|
||||
break;
|
||||
case 'S':
|
||||
offset+=panelHeight;
|
||||
break;
|
||||
case 'l':
|
||||
if(launcherSide==NOLAUNCHERS)
|
||||
{
|
||||
launcherSide=LAUNCHERINLEFT;
|
||||
offset+=addLaunchers(offset,mons->y,panelGravity,true);
|
||||
}
|
||||
else
|
||||
printError("Duplicate launcher widget");
|
||||
break;
|
||||
case 's':
|
||||
offset+=addSlider(offset,mons->y,panelGravity,true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
offset++;
|
||||
leftOffset=offset;
|
||||
}
|
||||
|
||||
int errHandler(Display *dpy,XErrorEvent *e)
|
||||
{
|
||||
char buf[128];
|
||||
|
||||
buf[0]=0;
|
||||
XGetErrorText(dpy,e->error_code,buf,sizeof buf);
|
||||
fprintf(stderr,"Xlib Error: %s - %s\n",buf,possibleError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void printError(const char *err)
|
||||
{
|
||||
fprintf(stderr,">>>%s<<<\n",err);
|
||||
}
|
||||
|
||||
bool windowDrop(LFSTK_windowClass *lwc,void* ud)
|
||||
{
|
||||
char *cleanstr=NULL;
|
||||
|
||||
if(lwc!=NULL)
|
||||
{
|
||||
if(lwc->droppedData.type=DROPURI)
|
||||
dropDesktopFile((const char*)lwc->droppedData.data,NULL);
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
|
||||
int main(int argc,char **argv)
|
||||
{
|
||||
char *env;
|
||||
XEvent event;
|
||||
int psize;
|
||||
int thold;
|
||||
int px,py;
|
||||
timeval tv={0,0};
|
||||
int key=666;
|
||||
int refreshmulti=0;
|
||||
|
||||
prefs.prefsMap={
|
||||
{prefs.LFSTK_hashFromKey("panelheight"),{TYPEINT,"panelheight","",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("panelwidth"),{TYPEINT,"panelwidth","",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("onmonitor"),{TYPEINT,"onmonitor","",false,0}},
|
||||
|
||||
{prefs.LFSTK_hashFromKey("termcommand"),{TYPESTRING,"termcommand","xterm -e ",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("logoutcommand"),{TYPESTRING,"logoutcommand","xterm",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("restartcommand"),{TYPESTRING,"restartcommand","xterm",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("shutdowncommand"),{TYPESTRING,"shutdowncommand","xterm",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("gadgetsright"),{TYPESTRING,"gadgetsright","L",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("gadgetsleft"),{TYPESTRING,"gadgetsleft","l",false,0}},
|
||||
|
||||
{prefs.LFSTK_hashFromKey("panelpos"),{TYPEINT,"panelpos","",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("panelgrav"),{TYPEINT,"panelgrav","",false,0}},
|
||||
|
||||
{prefs.LFSTK_hashFromKey("usetheme"),{TYPEBOOL,"usetheme","",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("nobuttons"),{TYPEBOOL,"nobuttons","",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("panelcolour"),{TYPESTRING,"panelcolour","",false,0}},
|
||||
{prefs.LFSTK_hashFromKey("textcolour"),{TYPESTRING,"textcolour","black",false,0}}
|
||||
};
|
||||
realMainLoop=true;
|
||||
|
||||
XSetErrorHandler(errHandler);
|
||||
|
||||
while(realMainLoop==true)
|
||||
{
|
||||
panelPos=PANELCENTRE;
|
||||
apc=new LFSTK_applicationClass();
|
||||
apc->LFSTK_addWindow(NULL,NULL);
|
||||
|
||||
mainwind=apc->mainWindow;
|
||||
mainwind->LFSTK_initDnD(true);
|
||||
mainwind->LFSTK_setWindowDropCallBack(windowDrop,(void*)0xdeadbeef);
|
||||
|
||||
WM_STATE=XInternAtom(mainwind->app->display,"WM_STATE",False);
|
||||
NET_WM_WINDOW_TYPE_NORMAL=XInternAtom(mainwind->app->display,"_NET_WM_WINDOW_TYPE_NORMAL",False);
|
||||
NET_WM_STATE_HIDDEN=XInternAtom(mainwind->app->display,"_NET_WM_STATE_HIDDEN",False);
|
||||
NET_WM_WINDOW_TYPE_DIALOG=XInternAtom(mainwind->app->display,"_NET_WM_WINDOW_TYPE_DIALOG",False);
|
||||
NET_WM_DESKTOP=XInternAtom(mainwind->app->display,"_NET_WM_DESKTOP",False);
|
||||
NET_WM_WINDOW_TYPE=XInternAtom(mainwind->app->display,"_NET_WM_WINDOW_TYPE",False);
|
||||
NET_WM_STATE=XInternAtom(mainwind->app->display,"_NET_WM_STATE",False);
|
||||
NET_WM_NAME=XInternAtom(mainwind->app->display,"_NET_WM_NAME",False);
|
||||
UTF8_STRING=XInternAtom(mainwind->app->display,"UTF8_STRING",False);
|
||||
|
||||
env=mainwind->globalLib->LFSTK_oneLiner("sed -n '2p' %s/lfsappearance.rc",apc->configDir);
|
||||
key=atoi(env);
|
||||
freeAndNull(&env);
|
||||
|
||||
apc->LFSTK_setTimer(refreshRate);
|
||||
apc->LFSTK_setTimerCallBack(timerCB,NULL);
|
||||
|
||||
if((queueID=msgget(key,IPC_CREAT|0660))==-1)
|
||||
fprintf(stderr,"Can't create message queue\n");
|
||||
|
||||
iconSize=32;
|
||||
|
||||
asprintf(&env,"%s/%s.rc",apc->configDir,RCNAME);
|
||||
|
||||
loadPrefs(env);
|
||||
|
||||
desktopTheme=mainwind->globalLib->desktopIconTheme.c_str();
|
||||
mons=apc->LFSTK_getMonitorData(onMonitor);
|
||||
|
||||
rightOffset=0;
|
||||
leftOffset=0;
|
||||
|
||||
if(useTheme==false)
|
||||
{
|
||||
mainwind->LFSTK_setTile(NULL,0);
|
||||
mainwind->LFSTK_setWindowColourName(NORMALCOLOUR,panelColour);
|
||||
}
|
||||
|
||||
addLeftGadgets();
|
||||
|
||||
if((leftOffset==0) && (rightOffset==0))
|
||||
{
|
||||
fprintf(stderr,"Not using empty panel ...\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
psize=leftOffset+abs(rightOffset);
|
||||
px=mons->x;
|
||||
py=mons->y;
|
||||
switch(panelGravity)
|
||||
{
|
||||
case PANELSOUTH:
|
||||
py=mons->y+mons->h-panelHeight;
|
||||
case PANELNORTH:
|
||||
switch(panelWidth)
|
||||
{
|
||||
case PANELFULL:
|
||||
panelWidth=mons->w;
|
||||
panelPos=PANELLEFT;
|
||||
break;
|
||||
case PANELSHRINK:
|
||||
panelWidth=psize;
|
||||
break;
|
||||
}
|
||||
switch(panelPos)
|
||||
{
|
||||
case PANELLEFT:
|
||||
px=mons->x;
|
||||
break;
|
||||
case PANELCENTRE:
|
||||
px=((mons->w/2)-(psize/2))+mons->x;
|
||||
break;
|
||||
case PANELRIGHT:
|
||||
px=mons->x+mons->w-psize;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case PANELEAST:
|
||||
px=mons->x+mons->w-panelHeight;
|
||||
case PANELWEST:
|
||||
switch(panelWidth)
|
||||
{
|
||||
case PANELFULL:
|
||||
panelWidth=panelHeight;
|
||||
panelHeight=mons->h;
|
||||
panelPos=PANELLEFT;
|
||||
break;
|
||||
case PANELSHRINK:
|
||||
panelWidth=panelHeight;
|
||||
panelHeight=psize;
|
||||
break;
|
||||
default:
|
||||
thold=panelWidth;
|
||||
panelWidth=panelHeight;
|
||||
panelHeight=thold;
|
||||
break;
|
||||
}
|
||||
switch(panelPos)
|
||||
{
|
||||
case PANELLEFT:
|
||||
py=mons->y;
|
||||
break;
|
||||
case PANELCENTRE:
|
||||
py=((mons->h/2)-(panelHeight/2))+mons->y;
|
||||
break;
|
||||
case PANELRIGHT:
|
||||
py=mons->y+mons->h-panelHeight;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
mainwind->LFSTK_resizeWindow(panelWidth,panelHeight,true);
|
||||
mainwind->LFSTK_moveWindow(px,py,true);
|
||||
mainwind->LFSTK_showWindow(true);
|
||||
mainwind->LFSTK_setKeepAbove(true);
|
||||
|
||||
int retval=apc->LFSTK_runApp();
|
||||
|
||||
free(env);
|
||||
|
||||
launcherList *freell;
|
||||
while(ll!=NULL)
|
||||
{
|
||||
freell=ll;
|
||||
if(ll->icon!=NULL)
|
||||
free(ll->icon);
|
||||
if(ll->entry.name!=NULL)
|
||||
free(ll->entry.name);
|
||||
if(ll->entry.exec!=NULL)
|
||||
free(ll->entry.exec);
|
||||
ll=ll->next;
|
||||
delete freell;
|
||||
}
|
||||
|
||||
free(iconL);
|
||||
free(iconM);
|
||||
free(iconH);
|
||||
clockButton=NULL;
|
||||
launcherSide=NOLAUNCHERS;
|
||||
delete apc;
|
||||
}
|
||||
cairo_debug_reset_static_data();
|
||||
return 0;
|
||||
}
|
225
LFSDock/LFSDock/src/slider.cpp
Normal file
225
LFSDock/LFSDock/src/slider.cpp
Normal file
@ -0,0 +1,225 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Thu 3 Jan 12:11:08 GMT 2019 keithdhedger@gmail.com
|
||||
|
||||
* This file (slider.cpp) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <alsa/asoundlib.h>
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
LFSTK_scrollBarClass *vsb=NULL;
|
||||
LFSTK_windowClass *scwindow=NULL;
|
||||
bool windowVisible=false;
|
||||
LFSTK_toggleButtonClass *volumeButton;
|
||||
char *iconH=NULL;
|
||||
char *iconM=NULL;
|
||||
char *iconL=NULL;
|
||||
int oldVolVal=-1;
|
||||
char label[32];
|
||||
|
||||
void setLabel(void)
|
||||
{
|
||||
int value=(int)(((double)vsb->LFSTK_getValue()/64.0)*100.0);
|
||||
sprintf(label,"Vol %i%%",value);
|
||||
volumeButton->LFSTK_setLabel((const char*)label);
|
||||
setIcon();
|
||||
volumeButton->LFSTK_clearWindow();
|
||||
}
|
||||
|
||||
int getAlsaVolume(bool setvol,int volume)
|
||||
{
|
||||
long value=-1;
|
||||
snd_mixer_t *handle;
|
||||
snd_mixer_selem_id_t *sid;
|
||||
snd_mixer_elem_t *elem;
|
||||
const char *card="default";
|
||||
const char *selem_name="Master";
|
||||
|
||||
snd_mixer_open(&handle,0);
|
||||
snd_mixer_attach(handle,card);
|
||||
snd_mixer_selem_register(handle,NULL,NULL);
|
||||
snd_mixer_load(handle);
|
||||
|
||||
snd_mixer_selem_id_malloc(&sid);
|
||||
snd_mixer_selem_id_set_index(sid,0);
|
||||
snd_mixer_selem_id_set_name(sid,selem_name);
|
||||
elem=snd_mixer_find_selem(handle,sid);
|
||||
|
||||
if(setvol==true)
|
||||
snd_mixer_selem_set_playback_volume_all(elem,volume);
|
||||
else
|
||||
snd_mixer_selem_get_playback_volume(elem,SND_MIXER_SCHN_UNKNOWN,&value);
|
||||
|
||||
snd_mixer_detach(handle,card);
|
||||
snd_mixer_close(handle);
|
||||
snd_mixer_selem_id_free(sid);
|
||||
|
||||
return(value);
|
||||
}
|
||||
|
||||
void setIcon(void)
|
||||
{
|
||||
int vol=vsb->LFSTK_getValue();
|
||||
if(vol<21)
|
||||
volumeButton->LFSTK_setImageFromPath(iconL,TOOLBAR,true);
|
||||
if((vol>21) && (vol<41))
|
||||
volumeButton->LFSTK_setImageFromPath(iconM,TOOLBAR,true);
|
||||
if(vol>42)
|
||||
volumeButton->LFSTK_setImageFromPath(iconH,TOOLBAR,true);
|
||||
}
|
||||
|
||||
bool sliderCB(void *p,void* ud)
|
||||
{
|
||||
LFSTK_toggleButtonClass *bc=static_cast<LFSTK_toggleButtonClass*>(p);
|
||||
geometryStruct geom;
|
||||
int x,y;
|
||||
Window dw;
|
||||
|
||||
if(p!=NULL)
|
||||
{
|
||||
if(bc->LFSTK_getValue()==1)
|
||||
{
|
||||
bc->LFSTK_getGeomWindowRelative(&geom,apc->rootWindow);
|
||||
switch(panelGravity)
|
||||
{
|
||||
case PANELNORTH:
|
||||
scwindow->LFSTK_moveWindow(geom.x,geom.y+geom.h,true);
|
||||
break;
|
||||
case PANELSOUTH:
|
||||
scwindow->LFSTK_moveWindow(geom.x,geom.y-SCROLLBARWIDTH,true);
|
||||
break;
|
||||
case PANELEAST:
|
||||
scwindow->LFSTK_moveWindow(geom.x-SCROLLBARWIDTH,geom.y,true);
|
||||
break;
|
||||
case PANELWEST:
|
||||
scwindow->LFSTK_moveWindow(geom.x+geom.w,geom.y,true);
|
||||
break;
|
||||
}
|
||||
scwindow->LFSTK_showWindow(true);
|
||||
scwindow->LFSTK_redrawAllGadgets();
|
||||
apc->windows->at(apc->LFSTK_findWindow(scwindow)).showing=true;
|
||||
}
|
||||
else
|
||||
{
|
||||
scwindow->LFSTK_hideWindow();
|
||||
apc->windows->at(apc->LFSTK_findWindow(scwindow)).showing=false;
|
||||
}
|
||||
bc->LFSTK_clearWindow();
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool valChanged(void *p,void* ud)
|
||||
{
|
||||
LFSTK_scrollBarClass *sb=NULL;
|
||||
char *command;
|
||||
char *vol;
|
||||
int volume=-1;
|
||||
|
||||
if(p!=NULL)
|
||||
{
|
||||
sb=static_cast<LFSTK_scrollBarClass*>(p);
|
||||
if(sb!=NULL)
|
||||
{
|
||||
getAlsaVolume(true,sb->LFSTK_getValue());
|
||||
setLabel();
|
||||
}
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
|
||||
void updateSlider(void)
|
||||
{
|
||||
int volume;
|
||||
|
||||
volume=getAlsaVolume(false,-1);
|
||||
if(oldVolVal!=volume)
|
||||
{
|
||||
vsb->LFSTK_setValue(volume);
|
||||
oldVolVal=vsb->LFSTK_getValue();
|
||||
setLabel();
|
||||
}
|
||||
}
|
||||
|
||||
int addSlider(int x,int y,int grav,bool fromleft)
|
||||
{
|
||||
int xpos=x;
|
||||
int ypos=y;
|
||||
int width=0;
|
||||
int height=0;
|
||||
int thisgrav=grav;
|
||||
int iconsize=16;
|
||||
char *label=mainwind->globalLib->LFSTK_oneLiner("amixer get Master|tail -n1|awk '{print \"%s \" $4}'|tr -d '[]'",SLIDERLABEL);
|
||||
|
||||
getAlsaVolume(false,-1);
|
||||
setSizes(&xpos,&ypos,&width,&height,&iconsize,&thisgrav,fromleft);
|
||||
|
||||
volumeButton=new LFSTK_toggleButtonClass(mainwind,label,xpos,ypos,width,height,thisgrav);
|
||||
volumeButton->LFSTK_setToggleStyle(TOGGLENORMAL);
|
||||
volumeButton->LFSTK_setMouseCallBack(NULL,sliderCB,(void*)volumeButton->LFSTK_getLabel());
|
||||
|
||||
setGadgetDetails(volumeButton);//TODO//
|
||||
|
||||
iconH=mainwind->globalLib->LFSTK_findThemedIcon(desktopTheme,"volume-high","");
|
||||
iconM=mainwind->globalLib->LFSTK_findThemedIcon(desktopTheme,"volume-medium","");
|
||||
iconL=mainwind->globalLib->LFSTK_findThemedIcon(desktopTheme,"volume-low","");
|
||||
|
||||
char *vol=mainwind->globalLib->LFSTK_oneLiner("amixer get Master|tail -n1|awk '{print $3}'");
|
||||
|
||||
windowInitStruct *win;
|
||||
int w,h;
|
||||
|
||||
win=new windowInitStruct;
|
||||
win->x=100;
|
||||
win->y=100;
|
||||
bool direction=false;
|
||||
|
||||
if((panelGravity==PANELWEST) || (panelGravity==PANELEAST))
|
||||
{
|
||||
w=16;
|
||||
h=100;
|
||||
direction=true;
|
||||
}
|
||||
else
|
||||
{
|
||||
w=100;
|
||||
h=16;
|
||||
direction=false;
|
||||
}
|
||||
|
||||
win->w=w;
|
||||
win->h=h;
|
||||
apc->LFSTK_addToolWindow(win);
|
||||
scwindow=apc->windows->back().window;
|
||||
|
||||
vsb=new LFSTK_scrollBarClass(scwindow,direction,0,0,w,h,BUTTONGRAV);
|
||||
|
||||
vsb->LFSTK_setMouseCallBack(NULL,valChanged,NULL);
|
||||
vsb->LFSTK_setScale(0,64);
|
||||
vsb->LFSTK_setValue(atoi(vol));
|
||||
vsb->reverse=direction;
|
||||
setIcon();
|
||||
free(vol);
|
||||
free(label);
|
||||
|
||||
return(width);
|
||||
}
|
||||
|
41
LFSDock/LFSDock/src/slider.h
Normal file
41
LFSDock/LFSDock/src/slider.h
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
*
|
||||
* ©K. D. Hedger. Thu 3 Jan 12:10:58 GMT 2019 keithdhedger@gmail.com
|
||||
|
||||
* This file (slider.h) is part of LFSPanel.
|
||||
|
||||
* LFSPanel 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 3 of the License, or
|
||||
* at your option) any later version.
|
||||
|
||||
* LFSPanel 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 LFSPanel. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _SLIDER_
|
||||
#define _SLIDER_
|
||||
|
||||
#define SLIDERWIDTH 100
|
||||
#define SLIDERLABEL "Vol"
|
||||
|
||||
extern LFSTK_windowClass *scwindow;
|
||||
extern bool windowVisible;
|
||||
extern LFSTK_toggleButtonClass *volumeButton;
|
||||
extern LFSTK_scrollBarClass *vsb;
|
||||
extern char *iconH;
|
||||
extern char *iconM;
|
||||
extern char *iconL;
|
||||
extern int oldVolVal;
|
||||
|
||||
void setIcon(void);
|
||||
int addSlider(int x,int y,int grav,bool fromleft);
|
||||
void updateSlider(void);
|
||||
int getAlsaVolume(bool setvol,int volume);
|
||||
|
||||
#endif
|
2
LFSDock/Makefile.am
Normal file
2
LFSDock/Makefile.am
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
SUBDIRS = LFSDock/app
|
10
LFSDock/autogen.sh
Executable file
10
LFSDock/autogen.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
./remakesourcelist
|
||||
aclocal
|
||||
autoheader
|
||||
touch NEWS README AUTHORS ChangeLog
|
||||
automake --add-missing --copy
|
||||
autoconf
|
||||
./configure $@
|
||||
|
74
LFSDock/configure.ac
Normal file
74
LFSDock/configure.ac
Normal file
@ -0,0 +1,74 @@
|
||||
|
||||
AC_INIT([LFSDock],[0.1.0],[PROJ],[LFSPanel])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_PROG_CXX
|
||||
|
||||
AM_INIT_AUTOMAKE
|
||||
|
||||
AC_PROG_CC
|
||||
|
||||
X11_MODULES="x11 >= 1.6.2"
|
||||
PKG_CHECK_MODULES(X11, $X11_MODULES)
|
||||
AC_SUBST(X11_CFLAGS)
|
||||
AC_SUBST(X11_LIBS)
|
||||
|
||||
ALSA_MODULES="alsa >= 1.1.5"
|
||||
PKG_CHECK_MODULES(ALSA, $ALSA_MODULES)
|
||||
AC_SUBST(ALSA_CFLAGS)
|
||||
AC_SUBST(ALSA_LIBS)
|
||||
|
||||
XFT_MODULES="xft >= 2.3.1"
|
||||
PKG_CHECK_MODULES(XFT, $XFT_MODULES)
|
||||
AC_SUBST(XFT_CFLAGS)
|
||||
AC_SUBST(XFT_LIBS)
|
||||
|
||||
LIBGLIB_MODULES="glib-2.0 >= 2.60.0"
|
||||
PKG_CHECK_MODULES(LIBGLIB, $LIBGLIB_MODULES)
|
||||
AC_SUBST(LIBGLIB_LIBS)
|
||||
AC_SUBST(LIBGLIB_CFLAGS)
|
||||
|
||||
CAIRO_MODULES="cairo >= 1.12.16"
|
||||
PKG_CHECK_MODULES(CAIRO, $CAIRO_MODULES)
|
||||
AC_SUBST(CAIRO_LIBS)
|
||||
AC_SUBST(CAIRO_CFLAGS)
|
||||
|
||||
LFSTK_MODULES="lfstk >= 0.5.1"
|
||||
PKG_CHECK_MODULES(LFSTK, $LFSTK_MODULES)
|
||||
AC_SUBST(LFSTK_LIBS)
|
||||
AC_SUBST(LFSTK_CFLAGS)
|
||||
|
||||
AC_CHECK_PROG(NOTIFYSEND, notify-send ,true,false)
|
||||
if test $NOTIFYSEND = false; then
|
||||
AC_MSG_NOTICE([No notify-send program found, install for lancher notification ...])
|
||||
else
|
||||
AC_ARG_ENABLE(notify,AS_HELP_STRING([--enable-notify],[Enable notifications]),[enable_notify=$enableval],[enable_notify="yes"])
|
||||
if test "$enable_notify" = "yes"; then
|
||||
AC_DEFINE([_GOTNOTIFYSEND_], [], [send notify])
|
||||
AC_MSG_NOTICE([Enabling notifications ...])
|
||||
else
|
||||
AC_MSG_NOTICE([Disabling notifications ...])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING(whether to build debug functions)
|
||||
AC_ARG_ENABLE(debug,AS_HELP_STRING([--enable-debug],[Enable debug code]),
|
||||
[enable_debug=$enableval],
|
||||
[enable_debug="no"])
|
||||
AC_MSG_RESULT($enable_debug)
|
||||
if test "$enable_debug" = "yes"; then
|
||||
AC_DEFINE([_ENABLEDEBUG_], [], [Enable debug code])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING(whether to warn about debug functions)
|
||||
AC_ARG_ENABLE(warn-debug,AS_HELP_STRING([--enable-warn-debug],[Enable warn debug code]),
|
||||
[enable_warn_debug=$enableval],
|
||||
[enable_warn_debug="no"])
|
||||
AC_MSG_RESULT($enable_warn_debug)
|
||||
if test "$enable_warn_debug" = "yes"; then
|
||||
AC_DEFINE([_WARN_ENABLEDEBUG_], [], [Enable warn debug code])
|
||||
fi
|
||||
|
||||
AC_CONFIG_FILES([Makefile LFSDock/app/Makefile])
|
||||
AC_OUTPUT
|
||||
|
BIN
LFSDock/lfsdock.mpz
Normal file
BIN
LFSDock/lfsdock.mpz
Normal file
Binary file not shown.
6
LFSDock/remakesourcelist
Executable file
6
LFSDock/remakesourcelist
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
shopt -s nullglob
|
||||
cd "LFSDock/src"
|
||||
csrclst=$(echo "../src/*.c" "../src/*.cpp")
|
||||
echo COMMONSRC = $csrclst > ../sources
|
Reference in New Issue
Block a user