From 47ff78e11d5a69c9a5471cbf8cb012b1e0fcbfc3 Mon Sep 17 00:00:00 2001 From: cuu Date: Thu, 6 Dec 2018 16:05:26 +0800 Subject: [PATCH] counter screen and interval checking in main.go --- .../GameShell/10_Settings/Sound/sound_page.go | 4 +- main.go | 194 +++++++++++++++++- sysgo/UI/counter_screen.go | 159 ++++++++++++++ sysgo/UI/foot_bar.go | 6 +- sysgo/UI/fullscreen.go | 35 ++++ sysgo/UI/label.go | 10 + sysgo/UI/main_screen.go | 14 +- sysgo/UI/multilabel.go | 4 + sysgo/UI/title_bar.go | 79 +++++-- sysgo/config.go | 26 ++- sysgo/gameshell/wallpaper/gameover.png | Bin 0 -> 1056 bytes sysgo/gameshell/wallpaper/loading.png | Bin 0 -> 1788 bytes sysgo/gameshell/wallpaper/seeyou.png | Bin 0 -> 2322 bytes sysgo/gameshell/wallpaper/updating.png | Bin 0 -> 2544 bytes 14 files changed, 501 insertions(+), 30 deletions(-) create mode 100644 sysgo/UI/counter_screen.go create mode 100644 sysgo/UI/fullscreen.go create mode 100644 sysgo/gameshell/wallpaper/gameover.png create mode 100644 sysgo/gameshell/wallpaper/loading.png create mode 100644 sysgo/gameshell/wallpaper/seeyou.png create mode 100644 sysgo/gameshell/wallpaper/updating.png diff --git a/Menu/GameShell/10_Settings/Sound/sound_page.go b/Menu/GameShell/10_Settings/Sound/sound_page.go index 00abce7..26a73f1 100644 --- a/Menu/GameShell/10_Settings/Sound/sound_page.go +++ b/Menu/GameShell/10_Settings/Sound/sound_page.go @@ -263,7 +263,9 @@ func (self *SoundPage) WhenSliderDrag(val int) { //value 0 - 100 if val <0 || val > 100 { return } - + + self.Screen.TitleBar.SetSoundVolume(val) + SetVolume(val) } diff --git a/main.go b/main.go index 48004f4..3a871da 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,7 @@ import ( "os" "fmt" - + gotime "time" "github.com/veandco/go-sdl2/sdl" "github.com/cuu/gogame/display" @@ -13,9 +13,187 @@ import ( "github.com/cuu/gogame/font" "github.com/cuu/gogame/time" + "github.com/cuu/LauncherGoDev/sysgo" + "github.com/cuu/LauncherGoDev/sysgo/UI" ) +var ( + flash_led1_counter = 0 + last_brt = 0 + passout_time_stage = 0 + led1_proc_file = "/proc/driver/led1" + + everytime_keydown = gotime.Now() + +) +// flash the Led1 on the GS back +func FlashLed1(main_screen *UI.MainScreen) { + + for { + if UI.FileExists(led1_proc_file) { + if main_screen.Closed == false { + if flash_led1_counter > 0 { + d := []byte(fmt.Sprintf("%d",0)) + err := ioutil.WriteFile(led1_proc_file, d, 0644) // turn off led1 + if err != nil { + fmt.Println(err) + } + flash_led1_counter = 0 + } + + } else { + flash_led1_counter +=1 + if flash_led1_counter == 3 { + d := []byte(fmt.Sprintf("%d",1)) + err := ioutil.WriteFile(led1_proc_file, d, 0644) + if err != nil { + fmt.Println(err) + } + } + + if flash_led1_counter == 5 { + d := []byte(fmt.Sprintf("%d",0)) + err := ioutil.WriteFile(led1_proc_file, d, 0644) + if err != nil { + fmt.Println(err) + } + } + + if flash_led1_counter == 11 { + flash_led1_counter = 1 + } + } + } + + gotime.Sleep(200 * gotime.Millisecond) + } +} + +//happens everytime when KeyDown occurs +func RestoreLastBackLightBrightness(main_screen *UI.MainScreen) bool { + + passout_time_stage = 0 + main_screen.TitleBar.InLowBackLight = -1 + main_screen.Closed = false + + if last_brt == -1 { + return true + } + + if UI.FileExists(sysgo.BackLight) { + lines,err := UI.ReadLines(sysgo.BackLight) + if err == nil { + brt,err2 := strconv.Atoi(strings.Trim(lines[0],"\r\n ")) + if err2 == nil { + if brt < last_brt { + d := []byte(fmt.Sprintf("%d",last_brt)) + ioutil.WriteFile(sysgo.BackLight,d,0644) + last_brt = -1 + } + } + }else { + fmt.Println(err) + } + + }else { + + } + + if UI.FileExists(led1_proc_file) { + d := []byte(fmt.Sprintf("%d",0)) + err := ioutil.WriteFile(led1_proc_file, d, 0644) + if err != nil { + fmt.Println(err) + } + } + + //Stop CounterScreen here + + if main_screen.CounterScreen.Counting == true { + main_screen.CounterScreen.StopCounter() + main_screen.Draw() + main_screen.SwapAndShow() + return false + } + + return true + +} + +//power stuff dealer +func InspectionTeam(main_screen *UI.MainScreen) { + + for { + cur_time := gotime.Now() + elapsed := cur_time.Sub(everytime_keydown) + + time1 := sysgo.PowerLevels[sysgo.CurPowerLevel].Dim + time2 := sysgo.PowerLevels[sysgo.CurPowerLevel].Close + time3 := sysgo.PowerLevels[sysgo.CurPowerLevel].PowerOff + + if elapsed > gotime.Duration(time1) *gotime.Millisecond && passout_time_stage == 0 { + fmt.Println("timeout, dim screen ",elapsed) + + if UI.FileExists(sysgo.BackLight) { + lines,err := UI.ReadLines(sysgo.BackLight) + + if err == nil { + brt,err2 := strconv.Atoi(strings.Trim(lines[0],"\r\n ")) + if err2 == nil { + if brt > 0 { + if last_brt < 0 { + last_brt = brt + } + d := []byte(fmt.Sprintf("%d",1)) + ioutil.WriteFile(sysgo.BackLight,d,0644) + } + } + } + } + + main_screen.TitleBar.InLowBackLight = 0 + if time2 != 0 { + passout_time_stage = 1 // next + } + everytime_keydown = cur_time + }else if elapsed > gotime.Duration(time2) *gotime.Millisecond && passout_time_stage == 1 { + fmt.Println("timeout, close screen ", elapsed) + + if UI.FileExists(sysgo.BackLight) { + d := []byte(fmt.Sprintf("%d",0)) + ioutil.WriteFile(sysgo.BackLight,d,0644) + } + + main_screen.TitleBar.InLowBackLight = 0 + main_screen.Closed = true + if time3 != 0 { + passout_time_stage = 2 // next + } + + everytime_keydown = cur_time + }else if elapsed > gotime.Duration(time3) * gotime.Millisecond && passout_time_stage == 2{ + + fmt.Println("Power Off counting down") + + main_screen.CounterScreen.Draw() + main_screen.CounterScreen.SwapAndShow() + main_screen.CounterScreen.StartCounter() + + if UI.FileExists(sysgo.BackLight) { + d := []byte(fmt.Sprintf("%d",last_brt)) + ioutil.WriteFile(sysgo.BackLight,d,0644) + } + + main_screen.TitleBar.InLowBackLight = 0 + + passout_time_stage = 4 + + } + + gotime.Sleep(UI.DT * gotime.Millisecond) + } +} func run() int { display.Init() @@ -46,10 +224,13 @@ func run() int { UI.SwapAndShow() - fmt.Println(main_screen) + //fmt.Println(main_screen) event.AddCustomEvent(UI.RUNEVT) - + + go FlashLed1(main_screen) + go InspectionTeam(main_screen) + running := true for running { ev := event.Wait() @@ -62,11 +243,14 @@ func run() int { fmt.Println("UserEvent: ",ev.Data["Msg"]) } if ev.Type == event.KEYDOWN { + everytime_keydown = gotime.Now() + if RestoreLastBackLightBrightness(main_screen) == false { + return + } + if ev.Data["Key"] == "Q" { main_screen.OnExitCb() return 0 - }else if ev.Data["Key"] == "D" { - time.Delay(1000) }else if ev.Data["Key"] == "P" { event.Post(UI.RUNEVT,"GODEBUG=cgocheck=0 sucks") // just id and string, simplify the stuff diff --git a/sysgo/UI/counter_screen.go b/sysgo/UI/counter_screen.go new file mode 100644 index 0000000..6b820d7 --- /dev/null +++ b/sysgo/UI/counter_screen.go @@ -0,0 +1,159 @@ +package UI + +import ( + + gotime "time" + +) +type CounterScreen struct { + FullScreen + + + CounterFont *ttf.Font + TextFont1 *ttf.Font + TextFont2 *ttf.Font + + TopLabel LabelInterface + BottomLabel LabelInterface + NumberLabel LabelInterface + BGColor *color.Color + FGColor *color.Color + + Counting bool + + Number int // 10 + + inter_counter int // + + TheTicker *gotime.Ticker + TickerStoped chan bool + +} + +func NewCounterScreen() *CounterScreen { + p := &CounterScreen{} + p.Number = 10 + p.CounterFont = Fonts["varela120"] + p.TextFont1 = Fonts["varela15"] + p.TextFont2 = Fonts["varela12"] + + p.BGColor = &color.Color{0,0,0,255} + p.FGColor = &color.Color{255,255,255,255} + + return p +} + +func (self *CounterScreen ) Interval() { + + for { + select { + case <-self.TheTicker.C: + self.inter_counter += 1 + + if self.Number == 0 { + self.Counting = false + self.TheTicker.Stop() + fmt.Println("do the real shutdown") + + if sysgo.CurKeySet != "PC" { + cmdpath := "feh --bg-center sysgo/gameshell/wallpaper/seeyou.png;" + cmdpath = cmdpath + "sleep 3;" + cmdpath = cmdpath + "sudo halt -p" + event.Post(RUNEVT,cmdpath) + + } + + break + } + + if self.inter_counter >= 2 { + self.Number -= 1 + if self.Number < 0 { + self.Number = 0 + } + + fmt.Println("sub Number ", self.Number) + self.inter_counter = 0 + + self.Draw() + self.SwapAndShow() + + } + case <- self.TickerStoped: + break + } + } + +} + + +func (self *CounterScreen) StartCounter() { + if self.Counting == true { + return + } + + self.Number = 10 + self.inter_counter = 0 + + self.Counting = true + + self.TheTicker.Start() + + go self.Interval() + +} + + +func (self *CounterScreen) StopCounter() { + if self.Counting == false { + return + } + + self.Counting = false + self.Number = 0 + self.inter_counter = 0 + + self.TheTicker.Stop() + self.TickerStoped <- true + +} + +func (self *CounterScreen) Init() { + + self.CanvasHWND = surface.Surface(self.Width,self.Height) + + self.TopLabel = NewLabel() + self.TopLabel.SetCanvasHWND( self.CanvasHWND) + self.TopLabel.Init("System shutdown in", self.TextFont1,self.FGColor) + + self.BottomLabel = NewLabel() + self.BottomLabel.SetCanvasHWND(self.CanvasHWND) + self.BottomLabel.Init("Press any key to stop countdown",self.TextFont2,self.FGColor) + + + self.NumberLabel = NewLabel() + self.NumberLabel.SetCanvasHWND(self.CanvasHWND) + number_str := fmt.Sprintf("%d",self.Number) + self.NumberLabel.Init(number_str,self.CounterFont,self.FGColor) + + self.TheTicker = gotime.NewTicker(500 * gotime.Millisecond) + self.TickerStoped = make(chan bool,1) + +} + +func (self *CounterScreen) Draw() { + surface.Fill(self.CanvasHWND, self.FGColor) + + self.TopLabel.NewCoord(Width/2,15) + self.TopLabel.DrawCenter(false) + + self.BottomLabel.NewCoord(Width/2, Height-15) + self.BottomLabel.DrawCenter(false) + + self.NumberLabel.NewCoord(Width/2,Height/2) + number_str := fmt.Sprintf("%d",self.Number) + self.NumberLabel.SetText(number_str) + self.NumberLabel.DrawCenter(false) + +} + diff --git a/sysgo/UI/foot_bar.go b/sysgo/UI/foot_bar.go index 133111c..6c67e1b 100644 --- a/sysgo/UI/foot_bar.go +++ b/sysgo/UI/foot_bar.go @@ -76,11 +76,7 @@ func (self *FootBarIconItem) Draw() { } type FootBar struct { - - PosX int - PosY int - Width int - Height int + Widget BarHeight int BorderWidth int CanvasHWND *sdl.Surface diff --git a/sysgo/UI/fullscreen.go b/sysgo/UI/fullscreen.go new file mode 100644 index 0000000..55f4b44 --- /dev/null +++ b/sysgo/UI/fullscreen.go @@ -0,0 +1,35 @@ +package UI + +import ( + + "github.com/cuu/gogame/surface" + +) + +type FullScreen struct { + Widget + CanvasHWND *sdl.Surface + HWND *sdl.Surface + +} + +func NewFullScreen() *FullScreen { + p := &FullScreen{} + + return p + +} + +func (self *FullScreen) SwapAndShow() { + if self.HWND !=nil { + rect_ := rect.Rect(self.PosX,self.PosY,self.Width,self.Height) + surface.Blit(self.HWND,self.CanvasHWND,&rect_,nil) + SwapAndShow() + } + +} + +func (self *FullScreen) Draw() { + + +} diff --git a/sysgo/UI/label.go b/sysgo/UI/label.go index 743aa6e..622d3d9 100644 --- a/sysgo/UI/label.go +++ b/sysgo/UI/label.go @@ -22,6 +22,7 @@ type LabelInterface interface { GetText() string SetText(text string) Draw() + DrawCenter(bold bool) } type Label struct { @@ -87,6 +88,15 @@ func (self *Label) SetText(text string) { self.Width,self.Height = font.Size(self.FontObj, self.Text) } +func (self *Label) DrawCenter(bold bool) { // default bold is false + font.SetBold(self.FontObj,bold) + my_text := font.Render(self.FontObj,self.Text, true, self.Color, nil) + + rect_ := draw.MidRect(self.PosX,self.PosY,self.Width,self.Height,Width,Height) + + surface.Blit(self.CanvasHWND,my_text,rect_,nil) +} + func (self *Label) Draw() { font.SetBold(self.FontObj,false) // avoing same font tangling set_bold to others diff --git a/sysgo/UI/main_screen.go b/sysgo/UI/main_screen.go index ac1cae3..5d6e89a 100644 --- a/sysgo/UI/main_screen.go +++ b/sysgo/UI/main_screen.go @@ -141,13 +141,11 @@ func (self *MessageBox) Draw() { } type MainScreen struct { + Widget Pages []PageInterface PageMax int PageIndex int - PosX int - PosY int - Width int - Height int + MyPageStack *PageStack CurrentPage PageInterface CanvasHWND *sdl.Surface @@ -159,6 +157,8 @@ type MainScreen struct { IconFont *ttf.Font SkinManager *SkinManager DBusManager *DBUS.DBus + CounterScreen *CounterScreen + Closed bool } @@ -186,6 +186,12 @@ func (self *MainScreen) Init() { self.SkinManager.Init() self.DBusManager = DBUS.DBusHandler + + self.CounterScreen = NewCounterScreen() + self.CounterScreen.HWND = self.HWND + self.CounterScreen.Init() + + } func (self *MainScreen) FartherPages() { // right after ReadTheDirIntoPages diff --git a/sysgo/UI/multilabel.go b/sysgo/UI/multilabel.go index e2f8271..3c1bfa4 100644 --- a/sysgo/UI/multilabel.go +++ b/sysgo/UI/multilabel.go @@ -66,6 +66,10 @@ func (self *MultiLabel) SetText(text string) { } +func (self *MultiLabel) DrawCenter(bold bool) { + +} + func (self *MultiLabel) Draw() { font.SetBold(self.FontObj,false) // avoing same font tangling set_bold to others self.blit_text(self.CanvasHWND, self.Text,self.PosX,self.PosY,self.FontObj) diff --git a/sysgo/UI/title_bar.go b/sysgo/UI/title_bar.go index 3a8dbf4..ab78599 100644 --- a/sysgo/UI/title_bar.go +++ b/sysgo/UI/title_bar.go @@ -7,7 +7,7 @@ import ( "strconv" "bufio" "strings" - "time" + gotime "time" "github.com/veandco/go-sdl2/sdl" "github.com/veandco/go-sdl2/ttf" @@ -88,11 +88,7 @@ func (self *TitleBarIconItem) Draw() { type TitleBar struct { - - PosX int - PosY int - Width int - Height int + Widget BarHeight int LOffset int ROffset int @@ -103,12 +99,16 @@ type TitleBar struct { CanvasHWND *sdl.Surface HWND *sdl.Surface Title string + InLowBackLight int + InAirPlaneMode bool + SkinManager *SkinManager //set by MainScreen DBusManager DBUS.DBusInterface icon_base_path string /// SkinMap("gameshell/titlebar_icons/") - + + TitleFont *ttf.Font TimeFont *ttf.Font } @@ -141,11 +141,33 @@ func NewTitleBar() *TitleBar { } func (t *TitleBar) RoundRobinCheck() { - + for { + + if self.InLowBackLight < 0 { + self.CheckBatteryStat() + ///self.CheckBluetooth() + self.UpdateWifiStrength() + + }else if self.InLowBackLight >= 0 { + self.InLowBackLight +=1 + + if self.InLowBackLight > 10 { + self.CheckBatteryStat() + + self.UpdateWifiStrength() + + self.InLowBackLight = 0 // reset + } + + } + + gotime.Sleep(3000 * gotime.Millisecond) + + } } func (t *TitleBar) UpdateWifiStrength() { - + self.Draw(self.Title) } func (t *TitleBar) GetWifiStrength(stren int) int { @@ -170,10 +192,10 @@ func (self *TitleBar) SyncSoundVolume() { vol, err := volume.GetVolume() if err != nil { - log.Fatalf("get volume failed: %+v", err) + log.Fatalf("TitleBar SyncSoundVolume get volume failed: %+v", err) vol = 0 } - fmt.Printf("current volume: %d\n", vol) + fmt.Printf("TitleBar SyncSoundVolume current volume: %d\n", vol) snd_segs := [][]int{ []int{0,10}, []int{10,30}, []int{30,70},[]int{70,100} } ge := 0 @@ -190,8 +212,22 @@ func (self *TitleBar) SyncSoundVolume() { // } +// for outside widget to update sound icon func (t *TitleBar) SetSoundVolume(vol int) { - //pass + + snd_segs := [][]int{ []int{0,10}, []int{10,30}, []int{30,70},[]int{70,100} } + ge := 0 + + for i,v := range snd_segs { + if vol >= v[0] && vol <= v[1] { + ge = i + break + } + } + + self.Icons["soundvolume"].SetIconIndex(ge) + self.Icons["sound"] = self.Icons["soundvolume"] + } func (self *TitleBar) CheckBatteryStat() { @@ -322,7 +358,22 @@ func (self *TitleBar) Init(main_screen *MainScreen) { if self.DBusManager.IsWifiConnectedNow() { print("wifi is connected") print( self.DBusManager.WifiStrength()) - } + }else { + + cmd := "sudo rfkill list | grep yes | cut -d \" \" -f3" //make sure sudo rfkill needs no password + out, err := exec.Command("bash", "-c", cmd).Output() + if err != nil { + fmt.Printf("Failed to execute command: %s\n", cmd) + }else { + outs := strings.Split(string(out),"\n") + if len(outs) > 0 && outs[0] == "yes" { + self.InAirPlaneMode = true + }else{ + self.InAirPlaneMode = false + } + } + + } } func (self *TitleBar) ClearCanvas() { @@ -343,7 +394,7 @@ func (self *TitleBar) Draw(title string) { self.ClearCanvas() self.Title = title - cur_time := jodaTime.Format("HH:mm", time.Now()) + cur_time := jodaTime.Format("HH:mm", gotime.Now()) time_text_w, time_text_h := font.Size(self.TimeFont, cur_time) title_text_w, title_text_h := font.Size(self.TitleFont, self.Title) diff --git a/sysgo/config.go b/sysgo/config.go index 9ec469c..23fb206 100644 --- a/sysgo/config.go +++ b/sysgo/config.go @@ -1,5 +1,13 @@ package sysgo +type PowerLevel struct { + Dim int + Close int + PowerOff int +} + +var PowerLevels map[string]*PowerLevel + var ( CurKeySet = "GameShell" // PC or GameShell DontLeave = false @@ -9,8 +17,24 @@ var ( UPDATE_URL="https://raw.githubusercontent.com/cuu/CPI/master/launchergo_ver.json" - VERSION="stable 1.22" + VERSION="0.22" SKIN="default" + //load from dot files + CurPowerLevel= "performance" + Lang = "English" + ) + + + +func init() { + if PowerLevels == nil { + PowerLevels = make(map[string]*PowerLevel) + PowerLevels["supersaving"] = &PowerLevel{10, 30, 120} + PowerLevels["powersaving"] = &PowerLevel{40, 120, 300} + PowerLevels["server"] = &PowerLevel{40, 120, 0 } + PowerLevels["performance"] = &PowerLevel{40, 0, 0 } + } +} diff --git a/sysgo/gameshell/wallpaper/gameover.png b/sysgo/gameshell/wallpaper/gameover.png new file mode 100644 index 0000000000000000000000000000000000000000..89b66b36e12f9811e5f7df0a31e63e7fc0abaf1a GIT binary patch literal 1056 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoKX9-C$wJ+|*$fQK&pllnLn`LHy>-y9Ie@{{ z(cs^I{p(YuC$Y)huzNN0rUY+pd%Wp_w(Oh{Cs0sU7r^J{Kf0@_vF`Y28KR&LDORH z)GuH6*Z=>!^ZUNrkKb*IaTC9D@wM&iSHI8M)z1Sf`p_G<_0P8b^JAL=k{OvI#UAwb z)UCF@eXnTG>B{)pYd^1F&n&#(&dQMz*NRa z>;4wv7C5nq;r@#^+qYD|-(EWX|MS_o`4{)S-t}GVW&Pg&^A9kwY|=TvIZyYX|L0Zd zt&6`ue__05bNB1@>n;oJkq2synx6Xe%umLGi9nk;6(*=QI80+;iewt)&?OA6@$0!P WebL*0@ewfRGkCiCxvXdz`1)5rKR>_vw(NF<_JOsQ*4C@*_Q&Vn z+p}`MeSO%~{fuwER&Cw9Iapg;`|Ub`2h(I_WUl=BRmIEJ9JONA{qm|JBI2IJ^HJ9y;sl=xo`m*RayU)^_c3|M_9%xw*c78Z@}MxwmfH z7IydQ)vMdCGZ~bwUcLJ2&p$suSFXRFU9HOyY%0OCO1sWsQQZ3Qdmq@32stQBV_@3I zBG94Q;Go0ElEkSX;LXq&!Nf86q)OMnWi^<+ZQHh6affkGIdy?KEVB`E1R(ix)3e-tJytTmE;?{rNoeg-h%VCUZi3o!|Vh zzHNJ3cy71;zNIPCVzxa~`>*zC1}GFx+(@hZwR+ayuZGqv6E>dlj(L_kcgtx@2dSMp z8jH^@-734Vx0m<%?;py-3c{H}VjmN)aVl(I_Lft?Z6oWmTP=N+sZ8J?JuPN&A@{!Jh3eVL5%C(hjd)kqe@Av?Kz zk{9PSRNb6pgKQB3+^J~|;h_f27baLs0 z%6vYU#5qQzu5JYrGtYo^(hHaE*Dv!q#Dbijo+@z^A75^_LzC&m)(*kXXT&66sn3%A z#GS&viL;d&Os;+T7Gz$Um~!WOp<`R&O(tffM7op1Df#k0qeZiKHEPAUGR(AI_pK;6 zrxBiPiyLCPi}TMIGp4-j&@(@ZFdv$_*D+l_@!|OSw)Kb3oxXoK)d!OFZvsVia*}ha zcVRdwrI6vMJ-U%qVl^|!8+pPxUwynOrHuM9qC-@VI|m6HowzUo}{ z-nh4K-ds6#%Io%PrX8W|?Ce|j?Tc$ZxIk>xtM!{VZ~pb;W3sNE-nGT<{i`m&+_KlL zLAtc8EbRTgy{mzB!L^eoJwvbB3qSZUdD`^puWxQn-@0p8l()BcDNupgHLikO`?^0X s*2nL^_U~Wa*WZ7wY;69#{kWeoC-bs*VojkhuvTO6boFyt=akR{02;XX5C8xG literal 0 HcmV?d00001 diff --git a/sysgo/gameshell/wallpaper/seeyou.png b/sysgo/gameshell/wallpaper/seeyou.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f62b7e4036db9171bdbbc19d3185bd2d1b9b37 GIT binary patch literal 2322 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 YSK