28 November 2015

Project Example, Membuat Taskbar menggunakan X11 API

Project ini merupakan salah satu project yang telah penulis upload atau dibagikan di Gambas Software Farm, berikut ini informasi singkat dari project.
Pembuat: Zainudin Ahmad
Nama Project: X11 Taskbar Example
Nama File Project: GPI-X11TaskbarExample
Tahun Pembuatan: 2015
Gambas Versi: 3.8
Jumlah Baris Kode: 56 baris
Lisensi: MIT License
Komponen : gb.image, gb.gui.qt, gb.form, gb.desktop.x11, gb.desktop

Project ini dibuat untuk memudahkan mempelajari membuat Taskbar dengan menggunakan X11 API, dan lebih detil lagi project ini juga mempelajari :
  • Bagaimana membuat Window bertipe Dock
  • Menambahkan nama dan icon window ke IconView
  • Bagaimana ActiveWindow event di class DesktopWatcher bekerja

Di bawah ini merupakan kode sumber dari project
' Gambas class file

'--------------------------------------------
'author : Zainudin Ahmad
'Website : GambasPI.blogspot.co.id
'License : MIT License
'-------
' Copyright (c) 2015 Zainudin Ahmad
'
' Permission is hereby granted, free of charge, to any person obtaining a copy
' of this software and associated documentation files (the "Software"), to deal
' in the Software without restriction, including without limitation the rights
' to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
' copies of the Software, and to permit persons to whom the Software is
' furnished to do so, subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included in
' all copies or substantial portions of the Software.
'
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
' THE SOFTWARE.
'--------------------------------------------


Private hWindWatch As DesktopWatcher
Private $iLast As Integer
Private $colAtom As New Collection

Private Function getAtom(sAtom As String) As Integer

   '----------- Note ------------------------------
   'This function borrow from Gambas source code
   'This have different license
   '-----------------------------------------------


   Dim iAtom As Integer

   If $colAtom.Exist(sAtom) Then Return $colAtom[sAtom]
   iAtom = X11.InternAtom(sAtom, True)
   $colAtom[sAtom] = iAtom
   Return iAtom

End

Public Sub Form_Open()

   hWindWatch = New DesktopWatcher As "WindWatch"

   Me.Center()

   lsbWindRefresh()

   'Create DOCK window
   X11.SetWindowProperty(Me.Id, getAtom("_NET_WM_WINDOW_TYPE"), getAtom("ATOM"), getAtom("_NET_WM_WINDOW_TYPE_DOCK"))

End

Public Sub WindWatch_ActiveWindow()

   lsbWindRefresh()

End

Private Sub lsbWindSelectActiveWindow()

   If Not lstWindows.Exist(Desktop.ActiveWindow) Then Return
   Object.Lock(lstWindows)
   lstWindows[Desktop.ActiveWindow].Selected = True
   $iLast = Desktop.ActiveWindow
   Object.Unlock(lstWindows)

End

Private Sub lsbWindRefresh()

   Dim hWind As DesktopWindow
   Dim Idx As Integer

   lstWindows.Clear()
   For Each hWind In getWindsList()
     'add windows name and icon to list
     lstWindows.Add(hWind.Id, hWind.Id & "-" & hWind.Name, hWind.Icon.Stretch(32, 32).Picture)
     Inc Idx
   Next
   lsbWindSelectActiveWindow()

End

Private Function getWindsList() As DesktopWindow[]

   Dim aRet As New DesktopWindow[]
   Dim hWind As DesktopWindow

   Desktop.Windows.Refresh()
   For Each hWind In Desktop.Windows
     If hWind.SkipTaskbar Or hWind.Desktop <> Desktop.Current Or hWind.Id = Me.Id Then Continue
     aRet.Add(hWind)
   Next

   Return aRet

End

Public Sub lstWindows_MouseDown()

   Dim iId As Integer

   If Not lstWindows.Current Then Return
   iId = lstWindows.Current.Key

   If iId = $iLast And If Not Desktop.Windows.FromHandle(iId).Minimized Then
     '
     Desktop.Windows.FromHandle(iId).Minimized = True

     Return
   Endif

   Desktop.Windows.FromHandle(iId).Activate()

End


Form, Control atau Container yang digunakan sewaktu mendisain(drag & drop dari Toolbox) menggunakan Form Disainer dalam project ini adalah
  • 1 Form bernama : FMain
  • 1 IconView bernama : lstWindows

Untuk aturan penamaan pada setiap element di dalam form dan juga penamaan variabel, konstanta, class dan lain-lain anda bisa melihat dihalaman ini : Naming Convention. Semoga saja project ini bisa bermanfaat buat anda, untuk mendapatkan project ini anda dapat mendownload nya melalui Gambas Sofware Farm atau dengan mengklik link dibawah ini.

Download Project

Ada kemungkinan project ini bisa berjalan di versi Gambas yang lebih rendah atau lebih tinggi dari versi Gambas 3.8 selama masih menggunakan versi Major yang sama.

Alhamdulillah, Selamat Mencoba :)

Tidak ada komentar:

Posting Komentar