Battery replicant returns correct widget
This commit is contained in:
parent
caa3d1d57b
commit
daa80065c6
@ -115,7 +115,7 @@ Widget Battery_XmdReplicantCreate (
|
||||
|
||||
XtManageChild(this->layout);
|
||||
XtManageChild(this->root);
|
||||
return this->layout;
|
||||
return this->root;
|
||||
}
|
||||
|
||||
BatteryInfo getBatteryInfo (void) {
|
||||
|
2
replicants/Clock/build.sh
Executable file
2
replicants/Clock/build.sh
Executable file
@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
../../scripts/buildreplicant.sh Clock "$@"
|
148
replicants/Clock/src/main.c
Normal file
148
replicants/Clock/src/main.c
Normal file
@ -0,0 +1,148 @@
|
||||
#define _XOPEN_SOURCE
|
||||
#include <Xm/Xm.h>
|
||||
#include <Xm/Frame.h>
|
||||
#include <Xm/Label.h>
|
||||
#include <Xm/DrawingA.h>
|
||||
|
||||
#include <Xmd/Icon.h>
|
||||
#include <Xmd/Exec.h>
|
||||
#include <Xmd/Replicant.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
typedef struct {
|
||||
unsigned long pollInterval;
|
||||
Bool analog;
|
||||
String format;
|
||||
XtAppContext application;
|
||||
Widget root;
|
||||
Widget face;
|
||||
GC gc;
|
||||
XtIntervalId timer;
|
||||
} ClockReplicant;
|
||||
|
||||
static void clockPoll (XtPointer, XtIntervalId *);
|
||||
static void resetClockPollTimeout (ClockReplicant *);
|
||||
static void handleDestroy (Widget, XtPointer, XtPointer);
|
||||
|
||||
int Clock_XmdReplicantVersion (void) {
|
||||
return XmdREPLICANT_VERSION;
|
||||
}
|
||||
|
||||
Widget Clock_XmdReplicantCreate (
|
||||
XtAppContext application,
|
||||
Widget parent,
|
||||
XmdReplicantState *state
|
||||
) {
|
||||
(void)(state);
|
||||
|
||||
ClockReplicant *this = XtNew(ClockReplicant);
|
||||
memset(this, 0, sizeof(*this));
|
||||
this->application = application;
|
||||
|
||||
/* read state */
|
||||
String pollIntervalString = XmdReplicantStateQuery(state, "Interval");
|
||||
if (pollIntervalString != NULL) {
|
||||
this->pollInterval = 1000 * atoi(pollIntervalString);
|
||||
}
|
||||
if (this->pollInterval == 0) this->pollInterval = 1000;
|
||||
XtFree(pollIntervalString);
|
||||
String typeString = XmdReplicantStateQuery(state, "Type");
|
||||
this->analog = strcmp(typeString, "Analog") == 0;
|
||||
XtFree(typeString);
|
||||
this->format = XmdReplicantStateQuery(state, "Format");
|
||||
if (this->format == NULL) this->format = XtNewString("%H:%M:%S");
|
||||
|
||||
/* create widgets */
|
||||
this->root = XtVaCreateWidget (
|
||||
"clock", xmFrameWidgetClass, parent,
|
||||
XmNshadowType, XmSHADOW_ETCHED_IN,
|
||||
NULL);
|
||||
XtAddCallback(this->root, XmNdestroyCallback, handleDestroy, NULL);
|
||||
if (this->analog) {
|
||||
/* analog */
|
||||
this->face = XtVaCreateWidget (
|
||||
"clockFace", xmDrawingAreaWidgetClass, this->root,
|
||||
XmNwidth, 48,
|
||||
XmNheight, 48,
|
||||
XmNresizePolicy, XmRESIZE_NONE,
|
||||
NULL);
|
||||
XGCValues values = { 0 };
|
||||
XtVaGetValues (parent,
|
||||
XmNforeground, &values.foreground,
|
||||
XmNbackground, &values.background,
|
||||
NULL);
|
||||
this->gc = XCreateGC (
|
||||
XtDisplay(this->face),
|
||||
RootWindowOfScreen(XtScreen(this->face)),
|
||||
GCForeground | GCBackground, &values);
|
||||
XtManageChild(this->face);
|
||||
} else {
|
||||
/* digital */
|
||||
this->face = XtVaCreateManagedWidget (
|
||||
"clockFace", xmLabelWidgetClass, this->root,
|
||||
XmNmarginWidth, 8,
|
||||
XmNmarginHeight, 8,
|
||||
NULL);
|
||||
}
|
||||
|
||||
clockPoll(this, NULL);
|
||||
XtManageChild(this->root);
|
||||
return this->root;
|
||||
}
|
||||
|
||||
void clockPoll (XtPointer clientData, XtIntervalId *timer) {
|
||||
(void)(clientData);
|
||||
(void)(timer);
|
||||
|
||||
ClockReplicant *this = clientData;
|
||||
|
||||
if (this->analog) {
|
||||
/*Display *display = XtDisplay(this->face);
|
||||
Window window = XtWindow(this->face);
|
||||
|
||||
XDrawLine(display, window, this->gc, 0, 0, 32, 32);
|
||||
|
||||
XClearWindow(display, window);*/
|
||||
} else {
|
||||
time_t now = time(NULL);
|
||||
struct tm *local = localtime(&now);
|
||||
char timeBuffer[64];
|
||||
strftime(timeBuffer, XtNumber(timeBuffer), this->format, local);
|
||||
|
||||
XmString timeString = XmStringCreateLocalized(timeBuffer);
|
||||
XtUnmanageChild(this->face);
|
||||
XtVaSetValues (
|
||||
this->face,
|
||||
XmNlabelString, timeString,
|
||||
NULL);
|
||||
XtManageChild(this->face);
|
||||
XmStringFree(timeString);
|
||||
}
|
||||
|
||||
resetClockPollTimeout(this);
|
||||
}
|
||||
|
||||
void resetClockPollTimeout (ClockReplicant *this) {
|
||||
this->timer = XtAppAddTimeOut (
|
||||
this->application, this->pollInterval, clockPoll, this);
|
||||
}
|
||||
|
||||
static void handleDestroy (
|
||||
Widget widget,
|
||||
XtPointer clientData,
|
||||
XtPointer callData
|
||||
) {
|
||||
(void)(callData);
|
||||
(void)(widget);
|
||||
|
||||
ClockReplicant *this = clientData;
|
||||
XtRemoveTimeOut(this->timer);
|
||||
XtFree(this->format);
|
||||
XtFree((char *)(this));
|
||||
}
|
Loading…
Reference in New Issue
Block a user