summaryrefslogtreecommitdiff
path: root/capplets/time-admin/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/time-admin/src/main.c')
-rw-r--r--capplets/time-admin/src/main.c427
1 files changed, 427 insertions, 0 deletions
diff --git a/capplets/time-admin/src/main.c b/capplets/time-admin/src/main.c
new file mode 100644
index 00000000..5952b71a
--- /dev/null
+++ b/capplets/time-admin/src/main.c
@@ -0,0 +1,427 @@
+/* mate-user-admin
+* Copyright (C) 2018 zhuyaliang https://github.com/zhuyaliang/
+*
+* 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 3 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, see <https://www.gnu.org/licenses/>.
+*/
+
+#include "time-tool.h"
+#include "time-zone.h"
+#include "time-map.h"
+
+#define LOCKFILE "/tmp/time-admin.pid"
+#define TIME_ADMIN_PERMISSION "org.mate.user.admin.administration"
+#define ICONFILE "/usr/share/mate-time-admin/icon/mate-times-admin.png"
+
+static gboolean CheckClockHealth(gpointer data)
+{
+ TimeAdmin *ta = (TimeAdmin *)data;
+ Update_Clock_Start(ta);
+ ta->ApplyId = 0;
+
+ return FALSE;
+}
+static void update_apply_timeout(TimeAdmin *ta)
+{
+ Update_Clock_Stop(ta);
+ if (ta->ApplyId > 0)
+ {
+ g_source_remove (ta->ApplyId);
+ ta->ApplyId = 0;
+ }
+ ta->ApplyId = g_timeout_add (10000, (GSourceFunc)CheckClockHealth,ta);
+}
+static void ChangeTimeValue(GtkSpinButton *spin_button,
+ gpointer *data)
+{
+ TimeAdmin *ta = (TimeAdmin *)data;
+ if(TimeoutFlag == 0)
+ {
+ update_apply_timeout(ta);
+ }
+}
+static GdkPixbuf * GetAppIcon(void)
+{
+ GdkPixbuf *Pixbuf;
+ GError *Error = NULL;
+
+ Pixbuf = gdk_pixbuf_new_from_file(ICONFILE,&Error);
+ if(!Pixbuf)
+ {
+ MessageReport(("Get Icon Fail"),Error->message,ERROR);
+ g_error_free(Error);
+ }
+
+ return Pixbuf;
+}
+static gboolean on_window_quit (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ TimeAdmin *ta = (TimeAdmin *)user_data;
+
+ QuitApp(ta);
+ return TRUE;
+}
+static void CloseWindow (GtkButton *button,gpointer data)
+{
+ TimeAdmin *ta = (TimeAdmin *)data;
+
+ QuitApp(ta);
+}
+static void InitMainWindow(TimeAdmin *ta)
+{
+ GtkWidget *Window;
+ GdkPixbuf *AppIcon;
+ //GError *error = NULL;
+
+ Window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ ta->MainWindow = WindowLogin = Window;
+ gtk_window_set_deletable(GTK_WINDOW(Window),FALSE);
+ gtk_window_set_hide_titlebar_when_maximized(GTK_WINDOW(Window),TRUE);
+ gtk_window_set_position(GTK_WINDOW(Window), GTK_WIN_POS_CENTER);
+ gtk_window_set_title(GTK_WINDOW(Window),_("Time and Date Manager"));
+ gtk_container_set_border_width(GTK_CONTAINER(Window),10);
+ gtk_widget_set_size_request(Window, 300, 360);
+ g_signal_connect(G_OBJECT(Window),
+ "delete-event",
+ G_CALLBACK(on_window_quit),
+ ta);
+
+ /*
+ ua->Permission = polkit_permission_new_sync (USER_ADMIN_PERMISSION, NULL, NULL, &error);
+ ua->ButtonLock = gtk_lock_button_new(ua->Permission);
+ gtk_lock_button_set_permission(GTK_LOCK_BUTTON (ua->ButtonLock),ua->Permission);
+ g_signal_connect(ua->Permission,
+ "notify",
+ G_CALLBACK (on_permission_changed),
+ ua);
+ */
+ AppIcon = GetAppIcon();
+ if(AppIcon)
+ {
+ gtk_window_set_icon(GTK_WINDOW(Window),AppIcon);
+ g_object_unref(AppIcon);
+ }
+}
+
+static int RecordPid(void)
+{
+ int pid = 0;
+ int fd;
+ int Length = 0;
+ char WriteBuf[30] = { 0 };
+ fd = open(LOCKFILE,O_WRONLY|O_CREAT|O_TRUNC,0777);
+ if(fd < 0)
+ {
+ MessageReport(_("open file"),_("Create pid file failed"),ERROR);
+ return -1;
+ }
+ chmod(LOCKFILE,0777);
+ pid = getpid();
+ sprintf(WriteBuf,"%d",pid);
+ Length = write(fd,WriteBuf,strlen(WriteBuf));
+ if(Length <= 0 )
+ {
+ MessageReport(_("write file"),_("write pid file failed"),ERROR);
+ return -1;
+ }
+ close(fd);
+
+ return 0;
+}
+/******************************************************************************
+* Function: ProcessRuning
+*
+* Explain: Check whether the process has been started,If the process is not started,
+* record the current process ID =====>"/tmp/user-admin.pid"
+*
+* Input:
+*
+*
+* Output: start :TRUE
+* not start :FALSE
+*
+* Author: zhuyaliang 31/07/2018
+******************************************************************************/
+static gboolean ProcessRuning(void)
+{
+ int fd = 0;
+ int pid = 0;
+ gboolean Run = FALSE;
+ char ReadBuf[30] = { 0 };
+
+ if(access(LOCKFILE,F_OK) == 0)
+ {
+ fd = open(LOCKFILE,O_RDONLY);
+ if(fd < 0)
+ {
+ MessageReport(_("open file"),_("open pid file failed"),ERROR);
+ return TRUE;
+ }
+ if(read(fd,ReadBuf,sizeof(ReadBuf)) <= 0)
+ {
+ MessageReport(_("read file"),_("read pid file failed"),ERROR);
+ goto ERROREXIT;
+ }
+ pid = atoi(ReadBuf);
+ if(kill(pid,0) == 0)
+ {
+ goto ERROREXIT;
+ }
+ }
+
+ if(RecordPid() < 0)
+ Run = TRUE;
+
+ return Run;
+ERROREXIT:
+ close(fd);
+ return TRUE;
+
+}
+static char *translate(const char *value)
+{
+ g_autofree gchar *zone_translated = NULL;
+ char *name;
+
+ zone_translated = g_strdup (dgettext (GETTEXT_PACKAGE_TIMEZONES,value));
+ name = g_strdup_printf (C_("timezone loc", "%s"),zone_translated);
+
+ return name;
+}
+static GtkWidget * TimeZoneAndNtp(TimeAdmin *ta)
+{
+ GtkWidget *table;
+ GtkWidget *TimeZoneLabel;
+ GtkWidget *NtpSyncLabel;
+ GtkWidget *NtpSyncSwitch;
+ const char *TimeZone;
+ gboolean NtpState;
+ char *ZoneName;
+
+ table = gtk_grid_new();
+ gtk_grid_set_column_homogeneous(GTK_GRID(table),TRUE);
+
+ TimeZoneLabel = gtk_label_new(NULL);
+ gtk_widget_set_halign(TimeZoneLabel,GTK_ALIGN_START);
+ SetLableFontType(TimeZoneLabel,"gray",11,_("Time Zone:"));
+ gtk_grid_attach(GTK_GRID(table) ,TimeZoneLabel, 0 , 0 , 1 , 1);
+
+ SetupTimezoneDialog(ta);
+ TimeZone = GetTimeZone(ta);
+ ZoneName = translate(TimeZone);
+ ta->TimeZoneButton = gtk_button_new_with_label(ZoneName);
+ g_signal_connect (ta->TimeZoneButton,
+ "clicked",
+ G_CALLBACK (RunTimeZoneDialog),
+ ta);
+
+ gtk_grid_attach(GTK_GRID(table) ,ta->TimeZoneButton,1 , 0 , 3 , 1);
+
+ NtpSyncLabel = gtk_label_new(NULL);
+ gtk_widget_set_halign(NtpSyncLabel,GTK_ALIGN_START);
+ SetLableFontType(NtpSyncLabel,"gray",11,_("Ntp Sync:"));
+ gtk_grid_attach(GTK_GRID(table) ,NtpSyncLabel, 0 , 1 , 1 , 1);
+
+ NtpSyncSwitch = gtk_switch_new();
+ NtpState = GetNtpState(ta);
+ if(NtpState)
+ {
+ ReloadNtp(ta->proxy,NtpState);
+ }
+ ta->NtpState = NtpState;
+ gtk_switch_set_state (GTK_SWITCH(NtpSyncSwitch),
+ NtpState);
+ gtk_grid_attach(GTK_GRID(table) ,NtpSyncSwitch, 1 , 1 , 1 , 1);
+ g_signal_connect (G_OBJECT(NtpSyncSwitch),
+ "state-set",
+ G_CALLBACK (ChangeNtpSync),
+ ta);
+
+ gtk_grid_set_row_spacing(GTK_GRID(table), 6);
+ gtk_grid_set_column_spacing(GTK_GRID(table), 12);
+
+ return table;
+
+}
+
+static GtkWidget *GetSpinButton(int Initial,int Maximum,TimeAdmin *ta)
+{
+ GtkWidget *SpinButton;
+ GtkAdjustment *Adjustment;
+
+ Adjustment = gtk_adjustment_new (Initial, 0, Maximum, 1, 0, 0);
+ SpinButton = gtk_spin_button_new (Adjustment, 1, 0);
+ gtk_widget_set_sensitive(SpinButton,!ta->NtpState);
+ gtk_widget_set_halign(SpinButton,GTK_ALIGN_START);
+ gtk_spin_button_set_wrap(GTK_SPIN_BUTTON (SpinButton), TRUE);
+ gtk_spin_button_set_numeric(GTK_SPIN_BUTTON (SpinButton),TRUE);
+ gtk_widget_set_hexpand (SpinButton,TRUE);
+ g_signal_connect (SpinButton,
+ "changed",
+ G_CALLBACK (ChangeTimeValue),
+ ta);
+
+ SetTooltip(SpinButton,!ta->NtpState);
+ return SpinButton;
+}
+static GtkWidget *SetClock(TimeAdmin *ta)
+{
+ GtkWidget *table;
+ GtkWidget *TimeLabel;
+ struct tm *LocalTime;
+
+ table = gtk_grid_new();
+ gtk_grid_set_column_homogeneous(GTK_GRID(table),TRUE);
+
+ TimeLabel = gtk_label_new(NULL);
+ SetLableFontType(TimeLabel,"green",13,_("Set Time"));
+ gtk_widget_set_halign(TimeLabel,GTK_ALIGN_CENTER);
+ gtk_widget_set_valign(TimeLabel,GTK_ALIGN_START);
+ gtk_widget_set_hexpand(TimeLabel,FALSE);
+ gtk_grid_attach(GTK_GRID(table) ,TimeLabel, 1 , 0 , 1 , 1);
+
+ LocalTime = GetCurrentTime();
+ ta->UpdateTimeId = 0;
+ ta->ApplyId = 0;
+
+ ta->HourSpin = GetSpinButton(LocalTime->tm_hour,23,ta);
+ gtk_grid_attach(GTK_GRID(table) ,ta->HourSpin, 0 , 1 , 1 , 1);
+
+ ta->MinuteSpin = GetSpinButton(LocalTime->tm_min,59,ta);
+ gtk_grid_attach(GTK_GRID(table) ,ta->MinuteSpin, 1 , 1 , 1 , 1);
+
+ ta->SecondSpin = GetSpinButton (LocalTime->tm_sec,59,ta);
+ gtk_grid_attach(GTK_GRID(table) ,ta->SecondSpin, 2 , 1 , 1 , 1);
+
+ Update_Clock_Start(ta);
+
+ gtk_grid_set_row_spacing(GTK_GRID(table), 6);
+ gtk_grid_set_column_spacing(GTK_GRID(table), 12);
+
+ return table;
+}
+
+static GtkWidget *SetDate(TimeAdmin *ta)
+{
+ GtkWidget *table;
+ GtkWidget *DateLabel;
+ struct tm *LocalTime;
+
+ table = gtk_grid_new();
+ gtk_grid_set_column_homogeneous(GTK_GRID(table),TRUE);
+
+ DateLabel = gtk_label_new(NULL);
+ SetLableFontType(DateLabel,"green",12,_("Set Date"));
+ gtk_grid_attach(GTK_GRID(table) ,DateLabel, 1 , 0 , 1 , 1);
+
+ LocalTime = GetCurrentTime();
+ ta->Calendar = gtk_calendar_new ();
+ gtk_widget_set_sensitive(ta->Calendar,!ta->NtpState);
+ SetTooltip(ta->Calendar,!ta->NtpState);
+ gtk_calendar_mark_day(GTK_CALENDAR(ta->Calendar),LocalTime->tm_mday);
+ ta->OldDay = LocalTime->tm_mday;
+ gtk_grid_attach(GTK_GRID(table) ,ta->Calendar, 0 , 1 , 3 , 3);
+
+ ta->CloseButton = gtk_button_new_with_label (_("Close"));
+ gtk_grid_attach(GTK_GRID(table) ,ta->CloseButton, 0 , 5 , 1 , 1);
+ g_signal_connect (ta->CloseButton,
+ "clicked",
+ G_CALLBACK (CloseWindow),
+ ta);
+
+ ta->SaveButton = gtk_button_new_with_label (_("Save"));
+ gtk_widget_set_sensitive(ta->SaveButton,!ta->NtpState);
+ gtk_grid_attach(GTK_GRID(table) ,ta->SaveButton, 2 , 5 , 1 , 1);
+ g_signal_connect (ta->SaveButton,
+ "clicked",
+ G_CALLBACK (SaveModifyTime),
+ ta);
+
+ gtk_grid_set_row_spacing(GTK_GRID(table), 6);
+ gtk_grid_set_column_spacing(GTK_GRID(table), 12);
+
+ return table;
+
+}
+static void CreateClockInterface(TimeAdmin *ta)
+{
+ GtkWidget *Vbox;
+ GtkWidget *Vbox1;
+ GtkWidget *Vbox2;
+ GtkWidget *Vbox3;
+
+ Vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
+ gtk_container_add(GTK_CONTAINER(ta->MainWindow), Vbox);
+
+ Vbox1 = TimeZoneAndNtp(ta);
+ gtk_box_pack_start(GTK_BOX(Vbox),Vbox1,TRUE,TRUE,8);
+
+ Vbox2 = SetClock(ta);
+ gtk_box_pack_start(GTK_BOX(Vbox),Vbox2,TRUE,TRUE,8);
+ Vbox3 = SetDate(ta);
+ gtk_box_pack_start(GTK_BOX(Vbox),Vbox3,TRUE,TRUE,8);
+}
+static gboolean InitDbusProxy(TimeAdmin *ta)
+{
+ GError *error = NULL;
+
+ ta->Connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+ if(ta->Connection == NULL)
+ {
+ MessageReport(_("g_bus_get_sync"),error->message,ERROR);
+ return FALSE;
+ }
+ ta->proxy = g_dbus_proxy_new_sync (ta->Connection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.timedate1",
+ "/org/freedesktop/timedate1",
+ "org.freedesktop.timedate1",
+ NULL,
+ &error);
+ if(ta->proxy == NULL)
+ {
+ MessageReport(_("g_bus_proxy_new"),error->message,ERROR);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+int main(int argc, char **argv)
+{
+ TimeAdmin ta;
+
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+ bind_textdomain_codeset (GETTEXT_PACKAGE_TIMEZONES, "UTF-8");
+
+ gtk_init(&argc, &argv);
+
+ /* Create the main window */
+ InitMainWindow(&ta);
+
+ /* Check whether the process has been started */
+ if(ProcessRuning() == TRUE)
+ exit(0);
+ if(InitDbusProxy(&ta) == FALSE)
+ {
+ exit(0);
+ }
+ CreateClockInterface(&ta);
+ gtk_widget_show_all(ta.MainWindow);
+ gtk_main();
+
+ return TRUE;
+}