prefs.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. 'use strict';
  2. import Adw from 'gi://Adw';
  3. import Gtk from 'gi://Gtk';
  4. import Gdk from 'gi://Gdk';
  5. import { ExtensionPreferences, gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
  6. export default class GjsOskPreferences extends ExtensionPreferences {
  7. fillPreferencesWindow(window) {
  8. const UIFolderPath = this.dir.get_child('ui').get_path();
  9. let iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default());
  10. iconTheme.add_search_path(UIFolderPath + `/icons`);
  11. const settings = this.getSettings('org.gnome.shell.extensions.gjsosk');
  12. const page1 = new Adw.PreferencesPage({
  13. title: _("General"),
  14. icon_name: "general-symbolic"
  15. });
  16. const behaviorGroup = new Adw.PreferencesGroup({
  17. title: _("Behavior")
  18. });
  19. page1.add(behaviorGroup);
  20. const layoutRow = new Adw.ActionRow({
  21. title: _('Layout')
  22. });
  23. behaviorGroup.add(layoutRow);
  24. let layoutList = ["Full Sized International", "Full Sized US", "Tenkeyless International", "Tenkeyless US", "Compact International", "Compact US", "Split International", "Split US"];
  25. let layoutDrop = Gtk.DropDown.new_from_strings(layoutList);
  26. layoutDrop.valign = Gtk.Align.CENTER;
  27. layoutDrop.selected = settings.get_int("layout");
  28. layoutRow.add_suffix(layoutDrop);
  29. layoutRow.activatable_widget = layoutDrop;
  30. const enableDragRow = new Adw.ActionRow({
  31. title: _('Enable Dragging')
  32. });
  33. behaviorGroup.add(enableDragRow);
  34. const dragEnableDT = new Gtk.Switch({
  35. active: settings.get_boolean('enable-drag'),
  36. valign: Gtk.Align.CENTER,
  37. });
  38. enableDragRow.add_suffix(dragEnableDT);
  39. enableDragRow.activatable_widget = dragEnableDT;
  40. const indEnabledRow = new Adw.ActionRow({
  41. title: _('Enable Panel Indicator')
  42. });
  43. behaviorGroup.add(indEnabledRow);
  44. const indEnabled = new Gtk.Switch({
  45. active: settings.get_boolean("indicator-enabled"),
  46. valign: Gtk.Align.CENTER,
  47. });
  48. indEnabledRow.add_suffix(indEnabled);
  49. indEnabledRow.activatable_widget = indEnabled;
  50. const row1t5 = new Adw.ActionRow({
  51. title: _('Open upon clicking in a text field')
  52. });
  53. behaviorGroup.add(row1t5);
  54. let dragOptList = [_("Never"), _("Only on Touch"), _("Always")];
  55. let dragOpt = Gtk.DropDown.new_from_strings(dragOptList);
  56. dragOpt.valign = Gtk.Align.CENTER;
  57. dragOpt.selected = settings.get_int("enable-tap-gesture");
  58. row1t5.add_suffix(dragOpt);
  59. row1t5.activatable_widget = dragOpt;
  60. const portraitSizing = new Adw.ExpanderRow({
  61. title: _('Portrait Sizing')
  62. });
  63. behaviorGroup.add(portraitSizing);
  64. let pW = new Adw.ActionRow({
  65. title: _('Width (%)')
  66. })
  67. let pH = new Adw.ActionRow({
  68. title: _('Height (%)')
  69. })
  70. let numChanger_pW = Gtk.SpinButton.new_with_range(0, 100, 5);
  71. numChanger_pW.value = settings.get_int('portrait-width-percent');
  72. numChanger_pW.valign = Gtk.Align.CENTER;
  73. pW.add_suffix(numChanger_pW);
  74. pW.activatable_widget = numChanger_pW;
  75. let numChanger_pH = Gtk.SpinButton.new_with_range(0, 100, 5);
  76. numChanger_pH.value = settings.get_int('portrait-height-percent');
  77. numChanger_pH.valign = Gtk.Align.CENTER;
  78. pH.add_suffix(numChanger_pH);
  79. pH.activatable_widget = numChanger_pH;
  80. portraitSizing.add_row(pW);
  81. portraitSizing.add_row(pH);
  82. const landscapeSizing = new Adw.ExpanderRow({
  83. title: _('Landscape Sizing')
  84. });
  85. behaviorGroup.add(landscapeSizing);
  86. let lW = new Adw.ActionRow({
  87. title: _('Width (%)')
  88. });
  89. let lH = new Adw.ActionRow({
  90. title: _('Height (%)')
  91. });
  92. let numChanger_lW = Gtk.SpinButton.new_with_range(0, 100, 5);
  93. numChanger_lW.value = settings.get_int('landscape-width-percent');
  94. numChanger_lW.valign = Gtk.Align.CENTER;
  95. lW.add_suffix(numChanger_lW);
  96. lW.activatable_widget = numChanger_lW;
  97. let numChanger_lH = Gtk.SpinButton.new_with_range(0, 100, 5);
  98. numChanger_lH.value = settings.get_int('landscape-height-percent');
  99. numChanger_lH.valign = Gtk.Align.CENTER;
  100. lH.add_suffix(numChanger_lH);
  101. lH.activatable_widget = numChanger_lH;
  102. landscapeSizing.add_row(lW);
  103. landscapeSizing.add_row(lH);
  104. const defaultPosition = new Adw.ActionRow({
  105. title: _('Default Position')
  106. });
  107. behaviorGroup.add(defaultPosition);
  108. let posList = [
  109. _("Top Left"), _("Top Center"), _("Top Right"),
  110. _("Center Left"), _("Center"), _("Center Right"),
  111. _("Bottom Left"), _("Bottom Center"), _("Bottom Right")
  112. ];
  113. let snapDrop = Gtk.DropDown.new_from_strings(posList);
  114. snapDrop.valign = Gtk.Align.CENTER;
  115. snapDrop.selected = settings.get_int("default-snap");
  116. defaultPosition.add_suffix(snapDrop);
  117. defaultPosition.activatable_widget = snapDrop;
  118. const soundPlayRow = new Adw.ActionRow({
  119. title: _('Play sound')
  120. });
  121. behaviorGroup.add(soundPlayRow);
  122. const soundPlayDT = new Gtk.Switch({
  123. active: settings.get_boolean('play-sound'),
  124. valign: Gtk.Align.CENTER,
  125. });
  126. soundPlayRow.add_suffix(soundPlayDT);
  127. soundPlayRow.activatable_widget = soundPlayDT;
  128. const appearanceGroup = new Adw.PreferencesGroup({
  129. title: _("Appearance")
  130. });
  131. page1.add(appearanceGroup);
  132. const colorRow = new Adw.ExpanderRow({
  133. title: _("Color")
  134. })
  135. appearanceGroup.add(colorRow);
  136. const lightCol = new Adw.ActionRow({
  137. title: _('Light Mode')
  138. });
  139. colorRow.add_row(lightCol)
  140. let rgba = new Gdk.RGBA();
  141. rgba.parse("rgba(" + settings.get_double("background-r") + ", " + settings.get_double("background-g") + ", " + settings.get_double("background-b") + ", " + settings.get_double("background-a") + ")");
  142. let colorButton = new Gtk.ColorButton({
  143. rgba: rgba,
  144. use_alpha: true,
  145. valign: Gtk.Align.CENTER
  146. });
  147. lightCol.add_suffix(colorButton);
  148. lightCol.activatable_widget = colorButton;
  149. const darkCol = new Adw.ActionRow({
  150. title: _('Dark Mode')
  151. });
  152. colorRow.add_row(darkCol)
  153. let rgba_d = new Gdk.RGBA();
  154. rgba_d.parse("rgba(" + settings.get_double("background-r-dark") + ", " + settings.get_double("background-g-dark") + ", " + settings.get_double("background-b-dark") + ", " + settings.get_double("background-a-dark") + ")");
  155. let colorButton_d = new Gtk.ColorButton({
  156. rgba: rgba_d,
  157. use_alpha: true,
  158. valign: Gtk.Align.CENTER
  159. });
  160. darkCol.add_suffix(colorButton_d);
  161. darkCol.activatable_widget = colorButton_d;
  162. let fontSize = new Adw.ActionRow({
  163. title: _('Font Size (px)')
  164. });
  165. appearanceGroup.add(fontSize);
  166. let numChanger_font = Gtk.SpinButton.new_with_range(0, 100, 1);
  167. numChanger_font.value = settings.get_int('font-size-px');
  168. numChanger_font.valign = Gtk.Align.CENTER;
  169. fontSize.add_suffix(numChanger_font);
  170. fontSize.activatable_widget = numChanger_font;
  171. const fontBoldRow = new Adw.ActionRow({
  172. title: _("Bold Font")
  173. })
  174. appearanceGroup.add(fontBoldRow)
  175. const fontBoldEnabled = new Gtk.Switch({
  176. active: settings.get_boolean("font-bold"),
  177. valign: Gtk.Align.CENTER
  178. })
  179. fontBoldRow.add_suffix(fontBoldEnabled)
  180. fontBoldRow.activatable_widget = fontBoldEnabled
  181. let borderSpacing = new Adw.ActionRow({
  182. title: _('Border Spacing (px)')
  183. });
  184. appearanceGroup.add(borderSpacing);
  185. let numChanger_bord = Gtk.SpinButton.new_with_range(0, 10, 1);
  186. numChanger_bord.value = settings.get_int('border-spacing-px');
  187. numChanger_bord.valign = Gtk.Align.CENTER;
  188. borderSpacing.add_suffix(numChanger_bord);
  189. borderSpacing.activatable_widget = numChanger_bord;
  190. let snapSpacing = new Adw.ActionRow({
  191. title: _('Drag snap spacing (px)')
  192. });
  193. appearanceGroup.add(snapSpacing);
  194. let numChanger_snap = Gtk.SpinButton.new_with_range(0, 50, 5);
  195. numChanger_snap.value = settings.get_int('snap-spacing-px');
  196. numChanger_snap.valign = Gtk.Align.CENTER;
  197. snapSpacing.add_suffix(numChanger_snap);
  198. snapSpacing.activatable_widget = numChanger_snap;
  199. const roundCorners = new Adw.ActionRow({
  200. title: _('Round Corners')
  201. });
  202. appearanceGroup.add(roundCorners);
  203. const roundKeyCDT = new Gtk.Switch({
  204. active: settings.get_boolean('round-key-corners'),
  205. valign: Gtk.Align.CENTER,
  206. });
  207. roundCorners.add_suffix(roundKeyCDT);
  208. roundCorners.activatable_widget = roundKeyCDT;
  209. const showIcon = new Adw.ActionRow({
  210. title: _('Show Special Key Icons')
  211. });
  212. appearanceGroup.add(showIcon);
  213. const showIconDT = new Gtk.Switch({
  214. active: settings.get_boolean('show-icons'),
  215. valign: Gtk.Align.CENTER,
  216. });
  217. showIcon.add_suffix(showIconDT);
  218. showIcon.activatable_widget = showIconDT;
  219. window.add(page1);
  220. let page2 = new Adw.PreferencesPage({
  221. title: _("About"),
  222. icon_name: 'info-symbolic',
  223. });
  224. let contribute_icon_pref_group = new Adw.PreferencesGroup();
  225. let icon_box = new Gtk.Box({
  226. orientation: Gtk.Orientation.VERTICAL,
  227. margin_top: 24,
  228. margin_bottom: 24,
  229. spacing: 18,
  230. });
  231. let icon_image = new Gtk.Image({
  232. icon_name: "input-keyboard-symbolic",
  233. pixel_size: 128,
  234. });
  235. let label_box = new Gtk.Box({
  236. orientation: Gtk.Orientation.VERTICAL,
  237. spacing: 6,
  238. });
  239. let label = new Gtk.Label({
  240. label: "GJS OSK",
  241. wrap: true,
  242. });
  243. let context = label.get_style_context();
  244. context.add_class("title-1");
  245. let another_label = new Gtk.Label({
  246. label: _("Autorelease ") + `fab8e97`
  247. });
  248. let links_pref_group = new Adw.PreferencesGroup();
  249. let code_row = new Adw.ActionRow({
  250. icon_name: "code-symbolic",
  251. title: _("More Information, submit feedback, and get help")
  252. });
  253. let github_link = new Gtk.LinkButton({
  254. label: "Github",
  255. uri: "https://github.com/Vishram1123/gjs-osk",
  256. });
  257. let icons_credit = new Adw.ActionRow({
  258. icon_name: "app-icon-design-symbolic",
  259. title: _("Icons sourced from")
  260. });
  261. let remixicon_link = new Gtk.LinkButton({
  262. label: "RemixIcon",
  263. uri: "https://remixicon.com/",
  264. });
  265. code_row.add_suffix(github_link);
  266. code_row.set_activatable_widget(github_link);
  267. links_pref_group.add(code_row);
  268. icons_credit.add_suffix(remixicon_link);
  269. icons_credit.set_activatable_widget(remixicon_link);
  270. links_pref_group.add(icons_credit);
  271. label_box.append(label);
  272. label_box.append(another_label);
  273. icon_box.append(icon_image);
  274. icon_box.append(label_box);
  275. contribute_icon_pref_group.add(icon_box);
  276. page2.add(contribute_icon_pref_group);
  277. page2.add(links_pref_group);
  278. window.add(page2);
  279. settings.bind("layout", layoutDrop, "selected", 0);
  280. settings.bind("enable-drag", dragEnableDT, "active", 0);
  281. settings.bind("enable-tap-gesture", dragOpt, "selected", 0);
  282. settings.bind("indicator-enabled", indEnabled, "active", 0);
  283. settings.bind("portrait-width-percent", numChanger_pW, "value", 0);
  284. settings.bind("portrait-height-percent", numChanger_pH, "value", 0);
  285. settings.bind("landscape-width-percent", numChanger_lW, "value", 0);
  286. settings.bind("landscape-height-percent", numChanger_lH, "value", 0);
  287. colorButton.connect("color-set", () => {
  288. settings.set_double("background-r", Math.round(colorButton.get_rgba().red * 255));
  289. settings.set_double("background-g", Math.round(colorButton.get_rgba().green * 255));
  290. settings.set_double("background-b", Math.round(colorButton.get_rgba().blue * 255));
  291. settings.set_double("background-a", colorButton.get_rgba().alpha);
  292. })
  293. colorButton_d.connect("color-set", () => {
  294. settings.set_double("background-r-dark", Math.round(colorButton_d.get_rgba().red * 255));
  295. settings.set_double("background-g-dark", Math.round(colorButton_d.get_rgba().green * 255));
  296. settings.set_double("background-b-dark", Math.round(colorButton_d.get_rgba().blue * 255));
  297. settings.set_double("background-a-dark", colorButton_d.get_rgba().alpha);
  298. })
  299. settings.bind("font-size-px", numChanger_font, "value", 0);
  300. settings.bind("font-bold", fontBoldEnabled, "active", 0)
  301. settings.bind("border-spacing-px", numChanger_bord, "value", 0);
  302. settings.bind("snap-spacing-px", numChanger_snap, "value", 0)
  303. settings.bind("round-key-corners", roundKeyCDT, "active", 0);
  304. settings.bind("play-sound", soundPlayDT, "active", 0);
  305. settings.bind("show-icons", showIconDT, "active", 0)
  306. settings.bind("default-snap", snapDrop, "selected", 0);
  307. window.connect("close-request", () => {
  308. settings.set_int("layout", layoutDrop.selected);
  309. settings.set_boolean("enable-drag", dragEnableDT.active);
  310. settings.set_int("enable-tap-gesture", dragOpt.selected);
  311. settings.set_boolean("indicator-enabled", indEnabled.active);
  312. settings.set_int("portrait-width-percent", numChanger_pW.value);
  313. settings.set_int("portrait-height-percent", numChanger_pH.value);
  314. settings.set_int("landscape-width-percent", numChanger_lW.value);
  315. settings.set_int("landscape-height-percent", numChanger_lH.value);
  316. settings.set_double("background-r", Math.round(colorButton.get_rgba().red * 255));
  317. settings.set_double("background-g", Math.round(colorButton.get_rgba().green * 255));
  318. settings.set_double("background-b", Math.round(colorButton.get_rgba().blue * 255));
  319. settings.set_double("background-a", colorButton.get_rgba().alpha);
  320. settings.set_double("background-r-dark", Math.round(colorButton_d.get_rgba().red * 255));
  321. settings.set_double("background-g-dark", Math.round(colorButton_d.get_rgba().green * 255));
  322. settings.set_double("background-b-dark", Math.round(colorButton_d.get_rgba().blue * 255));
  323. settings.set_double("background-a-dark", colorButton_d.get_rgba().alpha);
  324. settings.set_int("font-size-px", numChanger_font.value);
  325. settings.set_boolean("font-bold", fontBoldEnabled.active)
  326. settings.set_int("border-spacing-px", numChanger_bord.value);
  327. settings.set_int("snap-spacing-px", numChanger_snap.value)
  328. settings.set_boolean("round-key-corners", roundKeyCDT.active);
  329. settings.set_boolean("play-sound", soundPlayDT.active);
  330. settings.set_boolean("show-icons", showIconDT.active)
  331. settings.set_int("default-snap", snapDrop.selected);
  332. })
  333. }
  334. };